使用Python图像库和光晕效果调整透明度

时间:2012-02-04 17:27:10

标签: python image python-imaging-library alpha resampling

在SO上有几个类似的问题,但没有一个真的有帮助。基本上我正在尝试调整一个简单的png图像,如下所示:

http://media.spiralknights.com/wiki-images/3/3e/Equipment-Proto_Sword_icon.png (来自mmo Spiral Knights,版权所有Three Rings Entertainment)

我最初实现了一个在php中使用这些图像的实用程序,并且调整大小的实用程序运行得非常好。我使用了PHP文档中imagecopyresampled页面上描述的方法。

老实说,我甚至无法在Photoshop中更好地调整大小,但结果在python中几乎是灾难性的。我一直得到光环效果,我相信这至少部分是透明像素的实际RGBA值。在这里,这张照片更好地说明了:

resize examples

(第二次到最后一次调整大小只是我在另一个论坛上看到的建议,首先调整大小到最终大小的两倍,并且DID帮助至少一点,但还不够)

图像在调整大小时已处于RGBA模式。

正如您所看到的,PHP和Photoshop调整大小是无光晕的。老实说除了PHP调整大小之外的一切都做了太多的工作,我喜欢php图像中的最小调色板(如果你看一下大版本,你可以看到PHP调整大小在颜色之间使用较少),但我可以忍受Photoshop的方式已经调整了大小,甚至python的内部都调整了大小,但光环是不可接受的。

在我看来 - 如果我错了就纠正我 - PHP和Photoshop似乎知道在插值时不使用alpha通道中像素的颜色,但是python正在使用那个光边框,在其大小调整中是透明的。

不幸的是,我需要调整大量不同的图标,不同的配置文件,所以它们并不像这个圆形图标那么简单,但这只是我在实验时使用的第一个。

这本身并不是一个代码问题,但如果你需要一些东西可以看,那么这就是要点:

>> import Image
>> img = Image.open('swordorig.png')
>> img
<PngImagePlugin.PngImageFile image mode=RGBA size=256x256 at 0x2A3AF58>
>> img.resize((36,36), Image.ANTIALIAS).save('swordresize.png')

最终的问题是:有没有办法告诉PIL在重新采样时不要使用alpha为0的像素的颜色?

1 个答案:

答案 0 :(得分:6)

感谢大家的回答!特别是为了告诉我我实际上正在寻找的术语的rotoglup。通过PIL中的预乘alpha的堆栈溢出页面,我找到了一个有效的解决方案;这是更新的调整大小图表:

resize sheet 2

灰色条纹只是为了给人一种在较浅背景下的样子的印象。

https://stackoverflow.com/a/6882161/1189554

感谢madlag

所以我的代码最终看起来像这样:

>> import Image, numpy
>> img = Image.open('swordorig.png')
>> premult = numpy.fromstring(img.tostring(), dtype=numpy.uint8)
>> alphaLayer = premult[3::4] / 255.0
>> premult[::4] *= alphaLayer
>> premult[1::4] *= alphaLayer
>> premult[2::4] *= alphaLayer
>> img = Image.fromstring("RGBA", img.size, premult.tostring())
>> img.resize((36,36), Image.ANTIALIAS).save('swordresize.png')

你得到了表格底部的图标。还有比PHP版更多的颜色,以及非常温和的戒指,但总体来说,更好,更好。我确信可以调整算法以进一步改进它。再次感谢大家的回复!