簡體   English   中英

Python PIL-將多層圖像合並為一個

[英]Python PIL - Merge Multiple Layers of Images into One

我有多張帶有白色背景的PNG圖像,並且圖像的某些部分填充有圖案(可能是不同的顏色,黑色,藍色,紅色,黃色等)。

如何使用Python PIL庫將所有這些圖像合並到一個圖像中,以便所有非白色部分都出現在一個圖像上?

舉個例子,

我有以下3個PNG圖片:

圖片#1 圖片#2 圖片#3

現在,我想將所有這些圖像合並為一張圖像,以使背景仍然是白色,但是所有圖案都出現在一張圖像上。

例如,我選擇了2張圖像並嘗試了以下操作:

#! /usr/bin/python

from PIL import Image

background = Image.open("check00001.png")
foreground = Image.open("check00002.png")

background.paste(foreground, (0, 0), foreground)
background.show()

但是它以這樣的方式合並圖像:僅其中一個圖像的內容可見。

我需要對大量圖像進行此操作,其中每個圖像僅占最終圖像的一小部分。

據我所知,您可以使用Pillow輕松地將圖像的白色像素轉換為透明像素,並將它們逐層遮蓋。

要將白色像素轉換為透明像素 ,您需要先將圖像數據轉換為緩沖區,然后從緩沖區重新創建它,這是示例代碼:

from PIL import Image 
# your loop here
img = Image.open('img.png') 
img = img.convert("RGBA") 
datas = img.getdata() 
newData = [] 
for item in datas: 
    if item[0] == 255 and item[1] == 255 and item[2] == 255: 
        newData.append((255, 255, 255, 0)) 
    else: 
        newData.append(item) 

img.putdata(newData) 
img.save("mod_img1.png", "PNG")

然后像在代碼中一樣進行常規粘貼。

background = Image.open("mod_img1.png") 
foreground = Image.open("mod_img2.png") 

background.paste(foreground, (0, 0), foreground) 
background.show()

您可以使用安裝在大多數Linux發行版中且可用於macOS和Windows的ImageMagick輕松地完成此操作。 因此,假設您的圖像稱為a.pngb.pngc.png ,則可以在終端中運行:

convert a.png                                \
   \( b.png -transparent white \) -composite \
   \( c.png -transparent white \) -composite result.png

在此處輸入圖片說明

那就是說... “將圖像a.png作為具有白色背景的基本圖像,加載b.png並使所有白色像素透明並合成第一幅圖像的頂部。然后對c.png進行相同c.png並將輸出保存為result.png

請注意,我還添加了黑色邊框,以便您可以在StackOverflow的白色背景上辨別圖像的范圍。


請注意,如果您使用的是ImageMagick v7或更高版本,該命令將變為:

magick a.png                                 \
   \( b.png -transparent white \) -composite \
   \( c.png -transparent white \) -composite result.png

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM