粘贴具有 Alpha 透明度的图像
Pasting image with Alpha transpency
我有一段代码,它接受一个字符串并从该字符串构造一个类似涂鸦的图像。这些字母都是单独的 .PNG 图像,它们被读入并粘贴到一个新的、更长的图像上。我的问题是,虽然实际上保留了背景 alpha 通道,但字母重叠的地方却没有。请看图。
如何在保留 Alpha 通道的同时重叠粘贴这些字母? alpha_composite 和混合函数似乎都需要相同的图像才能工作。
需要注意的是,我可以在 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")
如果听起来您只是想要最简单的方法,我会建议 ImageMagick,它安装在大多数 Linux 发行版上,并且适用于 macOS 和 Windows。就在终端或命令提示符下:
magick a.png a.png a.png +smush -140 result.png
从 +smush
更改为 -smush
以垂直追加。增加 140 以增加重叠,或减小 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')
我有一段代码,它接受一个字符串并从该字符串构造一个类似涂鸦的图像。这些字母都是单独的 .PNG 图像,它们被读入并粘贴到一个新的、更长的图像上。我的问题是,虽然实际上保留了背景 alpha 通道,但字母重叠的地方却没有。请看图。
如何在保留 Alpha 通道的同时重叠粘贴这些字母? alpha_composite 和混合函数似乎都需要相同的图像才能工作。
需要注意的是,我可以在 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")
如果听起来您只是想要最简单的方法,我会建议 ImageMagick,它安装在大多数 Linux 发行版上,并且适用于 macOS 和 Windows。就在终端或命令提示符下:
magick a.png a.png a.png +smush -140 result.png
从 +smush
更改为 -smush
以垂直追加。增加 140 以增加重叠,或减小 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')