cog*_*ogs 5 python alpha image resampling python-imaging-library
在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值.在这里,这张图片告诉它更好:

(第二次到最后一次调整大小只是我在另一个论坛上看到的建议,首先调整大小到最终大小的两倍,并且DID帮助至少一点,但还不够)
调整大小时,图像已处于RGBA模式.
正如您所看到的,PHP和Photoshop调整大小是无光晕的.老实说除了PHP调整大小之外的一切都做了太多工作,我喜欢php图像中的最小调色板(如果你看一下大版本,你可以看到PHP调整大小在颜色之间使用较少),但我可以忍受Photoshop的方式已经调整了大小,甚至蟒蛇的内部都调整了大小,但光环是不可接受的.
在我看来 - 如果我错了就纠正我 - 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')
Run Code Online (Sandbox Code Playgroud)
最终的问题是:有没有办法告诉PIL不要在重新采样时使用alpha为0的像素的颜色?
感谢大家的回答!特别是为了告诉我我实际上正在寻找的术语的rotoglup.通过PIL中的预乘alpha的堆栈溢出页面,我找到了一个有效的解决方案; 这是一张更新的调整大小图片:

灰色条纹只是为了给人一种在较浅背景下看起来像什么的印象.
感谢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')
Run Code Online (Sandbox Code Playgroud)
然后你会得到表格底部的图标.还有比PHP版更多的颜色,以及非常温和的戒指,但总体来说,更好,更好.我确信可以调整算法以进一步改进它.再次感谢大家的回复!
| 归档时间: |
|
| 查看次数: |
4200 次 |
| 最近记录: |