Python PIL:图像大小调整:算法类似于firefox';s

Python PIL:图像大小调整:算法类似于firefox';s,python,image,thumbnails,python-imaging-library,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

我从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中调整大小要糟糕得多

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

编辑:将鼠标悬停以查看每个图像的内容

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

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

>>> image = Image.open(StringIO.StringIO(data)); 
>>> image.convert("RGB").resize((36,36), Image.ANTIALIAS)
尝试使用
resize()
方法,而不是
thumbnail()
。根据我的经验,他们的行为非常不同

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

我使用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一样好

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

不,这确实是预期的结果。在原始有限调色板模式下进行的任何调整都可能产生锯齿状垃圾,因为调色板中缺少可用的中间颜色;ANTIALIAS是唯一一个用于缩小尺寸的调整大小过滤器:双线性和双三次确实每个轴只取两个像素并在它们之间混合,这对于增大尺寸很好,但当一个或两个轴都缩小时根本不起作用

不幸的是,thumbnail()从未真正正常工作过,因此您必须自己动手。

发布的图像是一张图片。如果您通过PIL阅读,则其模式为
'P'
。关于重采样参数的PIL文档说明:

如果图像具有模式“1”或“p”,则始终将其设置为PIL.image.NEAREST

所以PIL将使用最近的过滤器来调整索引图像的大小,这是一个很好的选择

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

导入图像
img=Image.open(“beta-icon.gif”).convert(“RGB”)
img=img.resize((36,36),Image.LANCZOS)
保存(“img resized.png”)

对不起,我删掉了我原创的那行。但是,是的,这只是一种转变。我将尝试调整大小并进行比较。现在的示例页面都是resize(),它们看起来仍然比FF方式糟糕得多。还有其他建议吗?您使用的是什么版本的PIL?PIL版本:/usr/lib/python2.5/site-packages/PIL/PIL-1.1.6.egg-infoGimp会产生与PIL相同的结果。您帖子中的图像不起作用。这是获得良好缩略图的通用策略吗?如果你想要我的语料库的一个例子,我有大约10万张图片:当然。使用索引颜色调整图像大小通常不会提供好的结果。如果你不在乎保留调色板,那么你应该一直移动到RGB,然后调整大小,并(万一)再次减少颜色深度。谢谢Roberto。如果PIL是一种已知的方法,那么为什么默认情况下不这样做呢?@Paul:因为它不再像以前那样是一个256色的索引图像。默认情况下,更改模式(甚至调色板)是很难预期的行为。然后,我希望删除.thumbnail并替换为.thumbnail(size),如果需要,它会转换调色板,然后使用resize。作为PIL的新手,.缩略图似乎正是我所需要的。事实上,它是PIL中可以改进的不可靠的一个角落,但对新用户来说也是一个吸引人的陷阱。实际上,使用RGB时,我失去了alpha通道。有什么办法保持这种状态吗?