假设你想缩放一个透明图像,但还不知道背景的颜色,你将其复合到以后。不幸的是,PIL似乎包含了完全透明像素的颜色值,导致了不好的结果。有没有办法告诉PIL调整大小忽略完全透明的像素?PIL保存透明度和颜色的缩放图像?
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比例缩放(右)
编辑:它看起来像实现我正在寻找的,我将不得不修改resize函数本身的采样,使它会忽略具有完全透明度的像素。
edit2:我发现了一个非常丑陋的解决方案。它将全透明像素的颜色值设置为周围非完全透明像素的平均值,以便在调整大小时最大程度地降低完全透明像素颜色的影响。它的速度很慢,但如果没有其他解决方案,我会发布它。通过使用扩张操作来处理必要的像素可以使其更快。
EDIT3:预乘alpha是要走的路 - 看到马克的回答
是你的文件时加载到图片什么模式?也许alpha通道已经被删除了? – Ber
它说RGBA和缩放的图像在边界以外的GIMP中也看起来很好。 – Gonzo
您是否尝试将缩放后的图像混合在其他物体上,如白色背景?缩放是否可以,那么黑色的边缘会消失。 – Ber