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)
合成原理是:image(1alpha)+maskalphaimage * ( 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')
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章