说你想要缩放一个透明图像,但目前还不知道你将在以后将其组合到的背景颜色(s)。不幸的是,PIL似乎会合并完全透明像素的颜色值,从而导致糟糕的结果。有没有办法告诉PIL-resize忽略完全透明的像素?
import PIL.Image
filename = "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进行适当缩放的输出(右)
看起来要实现我想要的效果,我需要修改调整大小函数本身的采样方式,使其忽略完全透明的像素。
我找到了一个非常丑陋的解决方案。它将完全透明像素的颜色值设置为周围非完全透明像素的平均值,以最小化在调整大小时完全透明像素颜色的影响。简单形式下速度较慢,但如果没有其他解决方案,我会发表出来。可能可以通过使用膨胀操作只处理必要的像素来加快速度。