如何在Python中将一幅图像乘以另一幅图像
我想把一张图片叠加在另一张图片上。比如说,我有两张图片,分别是 greenapple.png 和 redcolor.png。现在我想把 redcolor.png 叠加到 greenapple.png 上,只有在 greenapple.png 的部分被覆盖,而其他地方保持不变。
我尝试使用 ImageChops 来实现这个效果,代码是:
import Image
import bakepass
from PIL import ImageChops
im1 = Image.open("greenapple.png")
im2 = Image.open("redcolor.png")
image = Image.open("new.png")
image.save(ImageChops.multiply(im1,im2))
但是用这段代码时,我遇到了一个值错误:图片不匹配。我使用的两张图片大小都是 512X512。请帮帮我。
1 个回答
1
这可能正是你想要的内容:改变色调
不过,如果你出于某种原因不想使用numpy,你可以尝试使用合成和透明度通道(下面的代码会在整个图像上设置一个透明度值,你可以通过img1的绿色/红色来计算在哪里改变img2的透明度):
from PIL import Image, ImageEnhance
img1 = Image.open('apple.png')
img2 = Image.open('green.png')
img2.putalpha(ImageEnhance.Brightness(img2.split()[3]).enhance(0.75))
img1 = Image.composite(img2, img1, img2)
img1.save('out.png')
这里是我用来做上面测试的两张图片(虽然可能有点大),第三张图片是上面代码的结果:
apple.png
green.png
out.png
还有PIL的paste()
函数:
from PIL import Image, ImageEnhance
img = Image.open('greenapple.png', 'r')
img_w, img_h = img.size
red = Image.open('redcolor.png', 'r')
# red_w, red_h = red.size
new = Image.new('RGBA', (1024,769), (255, 255, 255, 255))
new_w, new_h = new.size
offset=((new_w-img_w)/2,(new_h-img_h)/2)
red.putalpha(ImageEnhance.Brightness(red.split()[3]).enhance(0.75))
new.paste(img, offset)
new.paste(red, offset)
new.save('out.png')
可以尝试一下img.split()
,这个函数会给你分离出红色、绿色、蓝色、透明度
,然后在决定放置覆盖层的位置时,使用绿色/红色的颜色块。
这里还有一些其他的计算方法,比如你可以使用黑色作为排除颜色: