Image.alpha_composite( )——实现一张背景透明图像和一张背景不透明图像的合成

本文介绍了如何使用Python的PIL库处理透明和半透明图像的合成问题。通过convert(RGBA)转换模式,利用Image.alpha_composite()方法实现背景透明图像与背景不透明图像的合成,并在保存时转换回RGB模式。同时,文章提到了Image.blend()方法和Image.paste()方法的使用以及可能出现的错误及其解决办法。
摘要由CSDN通过智能技术生成

题目可以说是非常的长了,因为我也找不到精简的语言来描述这个问题。我觉得我总会做一些奇奇怪怪的事情,但又觉得应该把它们记录下来,因为想法不实现真的很难受(请理解一下强迫症的重度患者)。在很多小伙伴没有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')
1
2
3
4
5
6
7
8
9
10
11
12
对,代码就是这么几行,来看一下合成的效果:


------------我是非常可爱的分割线------------
如果上述已经解决大家的问题,剩下的部分可以按需自取,其实大多是博主在这个问题上的尝试记录(有其他方法的合并,也有报错记录),顺便也一起分享一下。

各种图像合成方法的比较
先放上各种方法的对比图~嗷呜呜呜呜呜呜呜!!!

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 * alphaimage∗(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')
1
2
3
4
5
6
7
8
9
10
11
12
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')
1
2
3
4
5
6
7
8
9
10
11
报错记录: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')

————————————————
版权声明:本文为CSDN博主「PRIS-SCMonkey」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43624538/article/details/104768037

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值