题目可以说是非常的长了,因为我也找不到精简的语言来描述这个问题。我觉得我总会做一些奇奇怪怪的事情,但又觉得应该把它们记录下来,因为想法不实现真的很难受(请理解一下强迫症的重度患者)。在很多小伙伴没有ps的基础能力的情况下,想合成一张背景透明的图像和一张背景不透明的图像属实有些无从下手,所以在这里就给大家用python提供一些解决方案,先上图⬇️,分别是mask.jpg, image.jpg,final.jpg。
我们合成图片的要求:
- 底片背景的透明度不改变,所以Image.blend( )不适用;
- 因为mask背景是透明的,图案是半透明的,所以需要转成’RGBA’模式,如果不转模式会报错;但是!!!在存储图片的时候要转回’RGB’格式。
我们用Image.alpha_composite( )来实现,代码如下⬇️。
import PIL.Image as Image
layer1 = Image.open("image.jpg").convert('RGBA') # 底图背景
layer2 = Image.open("mask.png").convert('RGBA') # mask
final = Image.new("RGBA", layer1.size) # 合成的image
final = Image.alpha_composite(final, layer1)
final = Image.alpha_composite(final, layer2)
final=final.convert('RGB')
final.save('image_mask.jpg')
对,代码就是这么几行,来看一下合成的效果:
如果上述已经解决大家的问题,剩下的部分可以按需自取,其实大多是博主在这个问题上的尝试记录(有其他方法的合并,也有报错记录),顺便也一起分享一下。
各种图像合成方法的比较
先放上各种方法的对比图~嗷呜呜呜呜呜呜呜!!!
Image.blend( )方法:
函数是:Image.blend(image, mask, alpha)
,
合成原理是:
i
m
a
g
e
∗
(
1
−
a
l
p
h
a
)
+
m
a
s
k
∗
a
l
p
h
a
image * ( 1 - alpha ) + mask * alpha
image∗(1−alpha)+mask∗alpha
from PIL import Image
layer1 = Image.open("image.jpg").convert('RGBA')
layer2 = Image.open("mask.png").convert('RGBA')
img = Image.blend(layer1, layer2, 0.3)
img_1 = Image.blend(layer1, layer2, 0.7)
img = img.convert('RGB')
img.save('image_mask_0.jpg')
img_1 = img_1.convert('RGB')
img_1.save('image_mask_1.jpg')
Image.paste( )方法:
其实和Image.alpha_composite( )的差别不大,在细节上尤其是半透明图案的处理上,Image.alpha_composite( )的效果会更好。
import PIL.Image as Image
layer1 = Image.open("image.jpg").convert('RGBA')
layer2 = Image.open("mask.png").convert('RGBA')
final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)
final1=final1.convert('RGB')
final1.save('image_mask_2.jpg')
报错记录:ValueError: bad transparency mask
原因: 合成过程中,image和mask没有转成’RGBA’的模式;
解决方法: mask = mask.convert('RGBA')
报错记录:OSError: cannot write mode RGBA as JPEG
原因: 存储image_new的时候没有转成’RGB’模式;
解决方法: img_new = img_new.convert('RGB')