7

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

http://media.spiralknights.com/wiki-images/3/3e/Equipment-Proto_Sword_icon.png (来自mmo Spiral Knights,版权三环娱乐)

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

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

调整大小示例

(倒数第二个调整大小只是我在另一个论坛上看到的将第一个调整到最终大小的两倍的建议,它至少有一点帮助,但还不够)

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

如您所见,PHP 和 Photoshop 调整大小是无晕的。老实说,除了 PHP 调整大小之外的所有工作都做了太多工作,我喜欢 php 图像中的最小调色板(如果您查看较大的版本,您会发现 PHP 调整大小在颜色之间使用较少),但我可以接受 Photoshop 的方式已经resize了,甚至python的内部都resize了,但是晕轮是不能接受的。

在我看来 - 如果我错了,请纠正我 - 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 的像素的颜色?

4

1 回答 1

7

感谢大家的回答!特别是 rotoglup 告诉我我真正在寻找什么。通过 PIL 中预乘 alpha 的堆栈溢出页面,我找到了一个可行的解决方案;这是调整大小图形的更新表:

调整工作表 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 版本更多的颜色,和一个非常温和的环,但总体上要好得多。我确信可以对算法进行调整以进一步改进它。再次感谢大家的回复!

于 2012-02-05T01:36:19.503 回答