【发布时间】:2012-10-23 09:18:45
【问题描述】:
假设您想缩放透明图像,但还不知道稍后将合成它的背景颜色。不幸的是,PIL 似乎包含了导致不良结果的完全透明像素的颜色值。有没有办法告诉 PIL-resize 忽略完全透明的像素?
import PIL.Image
filename = "trans.png" # http://qrc-designer.com/stuff/trans.png
size = (25,25)
im = PIL.Image.open(filename)
print im.mode # RGBA
im = im.resize(size, PIL.Image.LINEAR) # the same with CUBIC, ANTIALIAS, transform
# im.show() # does not use alpha
im.save("resizelinear_"+filename)
# PIL scaled image has dark border
具有 (0,0,0,0)(黑色但完全透明)背景的原始图像(左)
输出带有黑色光晕的图像(中)
用 gimp 缩放的正确输出(右)
编辑:看起来要实现我正在寻找的东西我必须修改调整大小函数本身的采样,以便它忽略具有完全透明度的像素。
edit2:我找到了一个非常丑陋的解决方案。它将完全透明像素的颜色值设置为周围非完全透明像素的平均值,以在调整大小时最大限度地减少完全透明像素颜色的影响。简单的形式很慢,但如果没有其他解决方案,我会发布它。通过使用扩张操作仅处理必要的像素可能会使其更快。
edit3:预乘 alpha 是要走的路 - 见 Mark 的回答
【问题讨论】:
-
您的文件加载到 Image 时是什么模式?也许 alpha 通道已被丢弃?
-
它说的是 RGBA,并且缩放后的图像在 Gimp 中看起来也不错,除了边框。
-
您是否尝试将缩放后的图像混合到其他东西上,例如白色背景?缩放是否正常,那么黑边就会消失。
-
在 Gimp 中,输出图像的边框被压平到白色背景上仍然存在问题。
标签: python resize transparency python-imaging-library scale