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

时间:2009-09-06 18:58:37

标签: python image thumbnails python-imaging-library

我从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 个答案:

答案 0 :(得分: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 :(得分:1)

  

看起来RGB和ANTIALIS看起来最好。还有其他建议吗?

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

不幸的是,thumbnail()从未真正正常工作,所以你必须自己动手。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

发布的图片是indexed image。如果通过PIL读取,其模式为'P'Image.resize()上有关重采样参数的PIL文档指出:

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

因此PIL将使用最近的过滤器来调整索引图像的大小,即low quality filter

正确的方法是将图像模式转换为RGB,然后将调整大小与高质量滤镜(例如Image.LANCZOS)一起使用。顺便说一下,Image.ANTIALIAS现在与源hereImage.LANCZOS相同。

import Image
img = Image.open("beta-icon.gif").convert("RGB")
img = img.resize((36,36), Image.LANCZOS)
img.save("img-resized.png")