【问题标题】:Pasting image with Alpha transpency粘贴具有 Alpha 透明度的图像
【发布时间】:2026-01-21 20:50:01
【问题描述】:

我有一段代码,它接受一个字符串并从该字符串构造一个类似涂鸦的图像。这些字母都是单独的 .PNG 图像,它们被读入并粘贴到一个新的、更长的图像上。我的问题是,虽然实际上保留了背景 alpha 通道,但字母重叠的地方却没有。请看图片。

如何在保留 Alpha 通道的同时粘贴这些重叠的字母?似乎 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")

【问题讨论】:

  • 请分享一些单个字母的图像以及您的代码。
  • 根据您的图片,单个字母 ping 似乎缺乏透明度,需要一些后期处理才能获得。切换到 C++ 在这里不太可能有帮助。
  • 是的,看起来您只需要将每个字母视为单独的 PNG 图像,就可以添加 alpha 层。然后他们应该粘贴好。在 python 中最容易完成。 Holler 和我会给你一个 python 片段来简单地在 png 上添加/修改 alpha 层来实现这个目的。
  • 我已经编辑了帖子并包含了我使用的代码。
  • David Kierans:我很想看看 Python 代码,但是我怎么给你发消息呢?这个网站没有PM功能吧?

标签: python python-imaging-library transparency alpha


【解决方案1】:

如果听起来你只是想要最简单的方法,我会建议 ImageMagick,它安装在大多数 Linux 发行版上,可用于 macOS 和 Windows。就在终端或命令提示符下:

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

+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')

【讨论】:

  • 这就是我一直在寻找的答案!非常感谢!
  • @Hyperkub。只是一个建议,因为您是该论坛上相对较新的用户。对对您有帮助的答案投赞成票通常是有礼貌的。
  • 对不起,我想这是真的。我忘记了低分问题,不记得它适用于投票。在这方面,我已投票支持您的帖子以提供帮助。
最近更新 更多