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

题目可以说是非常的长了,因为我也找不到精简的语言来描述这个问题。我觉得我总会做一些奇奇怪怪的事情,但又觉得应该把它们记录下来,因为想法不实现真的很难受(请理解一下强迫症的重度患者)。在很多小伙伴没有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(1alpha)+maskalpha

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')
在这里插入图片描述

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值