Python PIL - объединение нескольких слоев изображений в один - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть несколько изображений PNG с белым фоном, и некоторые части изображений заполнены узорами (это могут быть разные цвета: черный, синий, красный, желтый и т. Д.).

Как использоватьБиблиотека Python PIL для объединения всех этих изображений в одно изображение, так что все не белые части появляются на одном отдельном изображении?

Например,

У меня есть следующие 3 изображения PNG:

Image #1 Image #2 Image #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()

Но он объединяет изображениятаким образом, что видно только содержимое одного из изображений.

Мне нужно сделать это для большого набора изображений, где каждое изображение имеет небольшую часть конечного изображения.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Вы можете сделать это довольно просто с ImageMagick , который установлен на большинстве дистрибутивов Linux и доступен для macOS и Windows.Итак, если ваши изображения называются a.png, b.png и c.png, вы можете зайти в Терминал и запустить:

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

enter image description here

Это говорит о том, что ... "Возьмите изображение a.png в качестве основного изображения с его белым фоном, загрузите b.png и сделайте все его белые пиксели прозрачными и составными, что поверх первого изображения. Затем выполнитето же самое с c.png и сохраните вывод как result.png ".

Обратите внимание, что я также добавил черную рамку, чтобы вы могли разглядеть размер изображения на белом фоне StackOverflow.


Обратите внимание, что если вы используете ImageMagick v7 или новее, команда становится:

magick a.png                                 \
   \( b.png -transparent white \) -composite \
   \( c.png -transparent white \) -composite result.png
0 голосов
/ 03 февраля 2019

Насколько я вижу, вы можете легко преобразовать белые пиксели вашего изображения в прозрачные с помощью 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()
...