10

我从 PIL 的所有 4 种算法中得到了同样糟糕的调整大小

>>> data = utils.fetch("http://wavestock.com/images/beta-icon.gif")
>>> image = Image.open(StringIO.StringIO(data)); image.save("/home/ptarjan/www/tmp/metaward/original.png")
>>>
>>> image = Image.open(StringIO.StringIO(data)); image.resize((36,36), Image.ANTIALIAS).save("/home/ptarjan/www/tmp/metaward/antialias.png")
>>> image = Image.open(StringIO.StringIO(data)); image.resize((36,36), Image.BILINEAR).save("/home/ptarjan/www/tmp/metaward/bilinear.png")
>>> image = Image.open(StringIO.StringIO(data)); image.resize((36,36), Image.BICUBIC).save("/home/ptarjan/www/tmp/metaward/bicubic.png")
>>> image = Image.open(StringIO.StringIO(data)); image.resize((36,36), Image.NEAREST).save("/home/ptarjan/www/tmp/metaward/nearest.png")
>>>
>>> image = Image.open(StringIO.StringIO(data)); image.thumbnail((36,36), Image.ANTIALIAS); image.save("/home/ptarjan/www/tmp/metaward/antialias-thumb.png")
>>> image = Image.open(StringIO.StringIO(data)); image.thumbnail((36,36), Image.BILINEAR); image.save("/home/ptarjan/www/tmp/metaward/bilinear-thumb.png")
>>> image = Image.open(StringIO.StringIO(data)); image.thumbnail((36,36), Image.BICUBIC); image.save("/home/ptarjan/www/tmp/metaward/bicubic-thumb.png")
>>> image = Image.open(StringIO.StringIO(data)); image.thumbnail((36,36), Image.NEAREST); image.save("/home/ptarjan/www/tmp/metaward/nearest-thumb.png")
>>>
>>> image = Image.open(StringIO.StringIO(data)); image.convert("RGB").resize((36,36), Image.ANTIALIAS).save("/home/ptarjan/www/tmp/metaward/antialias-rgb.png")
>>> image = Image.open(StringIO.StringIO(data)); image.convert("RGB").resize((36,36), Image.BILINEAR).save("/home/ptarjan/www/tmp/metaward/bilinear-rgb.png")
>>> image = Image.open(StringIO.StringIO(data)); image.convert("RGB").resize((36,36), Image.BICUBIC).save("/home/ptarjan/www/tmp/metaward/bicubic-rgb.png")
>>> image = Image.open(StringIO.StringIO(data)); image.convert("RGB").resize((36,36), Image.NEAREST).save("/home/ptarjan/www/tmp/metaward/nearest-rgb.png")

但是结果看起来比在 Firefox 中调整大小要糟糕得多。

http://paulisageek.com/tmp/metaward/images.html

如何使用 PIL(或其他 python 图像库)获得与 firefox 结果类似的效果?

编辑:悬停鼠标查看每个图像是什么

它看起来像 RGB,然后 ANTIALIS 看起来最好。还有其他建议吗?

作为参考,这是看起来最好的一个:

>>> image = Image.open(StringIO.StringIO(data)); 
>>> image.convert("RGB").resize((36,36), Image.ANTIALIAS)
4

4 回答 4

9

I resized the "original" with Python and found the same results as you did. I also resized the "original" with GIMP and I got the same (if not inferior) quality. This made me suspect that Firefox cheats. Possibly it converts to RGB ("original" mode is indexed color). Thus the following code:

import Image
im=Image.open("beta-icon.gif")
im = im.convert("RGB")
im=im.resize((36,36), Image.ANTIALIAS)
im.save("q5.png")

The result is almost as good as that of Firefox.

于 2009-09-06T21:21:59.350 回答
1

它看起来像 RGB,然后 ANTIALIS 看起来最好。还有其他建议吗?

不,这确实是预期的结果。由于调色板中缺乏可用的中间颜色,在原始有限调色板模式下进行的任何调整都可能会产生锯齿状的垃圾;并且 ANTIALIAS 是唯一用于缩小比例的调整大小过滤器:BILINEAR 和 BICUBIC 确实每个轴只需要两个像素并在它们之间混合,这对于放大来说很好,但是当一个或两个轴都为缩小。

不幸的是 thumbnail() 从来没有真正正常工作,所以你必须自己做。

于 2009-09-08T01:07:27.627 回答
0

尝试使用该resize()方法而不是thumbnail(). 根据我的经验,它们的行为非常不同。

此外,您的代码显示读取 .gif,但您的原始代码是 .png。在开始减少数据之前,请确保您确实拥有所有原始数据。

于 2009-09-06T19:01:48.697 回答
0

发布的图像是索引图像。它的模式是'P'如果你通过 PIL 阅读它。关于 resample 参数的Image.resize()的 PIL 文档指出:

如果图像具有模式“1”或“P”,则始终设置为 PIL.Image.NEAREST

所以 PIL 将使用最近的过滤器来调整索引图像的大小,这是一个低质量的过滤器

正确的方法是将图像模式转换为RGB,然后使用高质量的过滤器调整大小,例如Image.LANCZOS. 顺便说一句,Image.ANTIALIAS现在与Image.LANCZOS, source here相同。

import Image
img = Image.open("beta-icon.gif").convert("RGB")
img = img.resize((36,36), Image.LANCZOS)
img.save("img-resized.png")
于 2020-11-19T09:52:40.947 回答