PIL:图像大小调整:类似于firefox的算法

问题描述 投票:8回答:3

我从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)
python image thumbnails python-imaging-library
3个回答
8
投票

我用Python调整了“原始”的大小,并找到了与你相同的结果。我还用GIMP调整了“原始”的大小,我得到了同样的(如果不是低劣的)质量。这让我怀疑Firefox作弊。可能它转换为RGB(“原始”模式是索引颜色)。因此以下代码:

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

结果几乎与Firefox一样好。


1
投票

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

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

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


0
投票

尝试使用resize()方法而不是thumbnail()。根据我的经验,他们表现得非常不同。

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

© www.soinside.com 2019 - 2024. All rights reserved.