Вставка изображения с альфа-прозрачностью - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть фрагмент кода, который берет строку и создает граффити-подобное изображение из этой строки.Все буквы представляют собой отдельные изображения .PNG, которые считываются и вставляются в новое, более длинное изображение.Моя проблема в том, что хотя фоновый альфа-канал фактически сохраняется, там, где буквы перекрываются, это не так.Пожалуйста, смотрите изображение.

Как вставить эти буквы, перекрывая друг друга, сохранив альфа-канал?Похоже, что для работы функций alpha_composite и blend нужны одинаковые изображения.

Следует отметить, что я могу делать это либо на Python, либо на C ++, я только что использовал python, потому что он казался очень быстрым и простым.

ИЗОБРАЖЕНИЕ проблемы

Одно оригинальное письмо

РЕДАКТИРОВАТЬ: Вот код.Наверняка должны быть лучшие способы сделать это.

import sys
from PIL import Image


def openLetters(letters):

    files = {
        'A': 'A-rens.png',
        'B': 'B-rens.png',
        'C': 'C-rens.png',
        'D': 'D-rens.png',
        'E': 'E-rens.png',
        'F': 'F-rens.png',
        'G': 'G-rens.png',
        'H': 'H-rens.png',
        'I': 'I-rens.png',
        'J': 'J-rens.png',
        'K': 'K-rens.png',
        'L': 'L-rens.png',
        'M': 'M-rens.png',
        'N': 'N-rens.png',
        'O': 'O-rens.png',
        'P': 'P-rens.png',
        'Q': 'Q-rens.png',
        'R': 'R-rens.png',
        'S': 'S-rens.png',
        'T': 'T-rens.png',
        'U': 'U-rens.png',
        'V': 'V-rens.png',
        'W': 'W-rens.png',
        'X': 'X-rens.png',
        'Y': 'Y-rens.png',
        'Z': 'Z-rens.png',
    }



    images = []
    for letter in letters:
        images.append(Image.open(files[letter]))
        print "Opened:" + files[letter]


    widths, heights = zip(*(i.size for i in images))

    totalWidth = sum(widths)
    maxHeight = max(heights)

    newImage = Image.new('RGBA', (totalWidth, maxHeight))

    x_offset = 0

    for im in images:
        newImage.paste(im, (x_offset, 0), mask=0)
        x_offset += im.size[0] - 200

    newImage.save(letters + ".png")


openLetters("ANDERS")

1 Ответ

0 голосов
/ 18 декабря 2018

Если, как это звучит, вам нужен самый простой способ, я бы предложил ImageMagick , который установлен в большинстве дистрибутивов Linux и доступен для macOS и Windows.Только в терминале или в командной строке:

magick a.png a.png a.png +smush -140  result.png

enter image description here

Измените значение с +smush на -smush для добавления по вертикали.Увеличьте 140, чтобы перекрывать больше, или уменьшайте, чтобы перекрывать меньше.


Если ваша ImageMagick версия старше, чем v7, замените magick в моей команде на convert.


Поскольку вы не дали мне достаточно букв для игры, вам придется обойтись этим в вашей версии Python:

#!/usr/bin/env python3

import sys
from PIL import Image


w = 3000
h = 1490

newImage = Image.new('RGBA', (w, h))
myMiserableA = Image.open('a.png').convert('RGBA')

x_offset = 0

for im in range(3):
    newImage.paste(myMiserableA, (x_offset, 0), mask=myMiserableA)
    x_offset += 1000

newImage.save('result.png')

enter image description here

...