【问题标题】:PIL: Image resizing : Algorithm similar to firefox'sPIL:图像调整大小:类似于Firefox的算法
【发布时间】:2009-09-06 18:58:37
【问题描述】:

从 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)

【问题讨论】:

  • 你使用的是什么版本的 PIL?
  • PIL 版本:/usr/lib/python2.5/site-packages/PIL/PIL-1.1.6.egg-info
  • Gimp 产生与 PIL 相同的结果。
  • 您帖子中的图片无效。

标签: python image thumbnails python-imaging-library


【解决方案1】:

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

【讨论】:

  • 这是获得优质缩略图的通用策略吗?如果你想要我的语料库的例子,我有大约 10k 张图片:metaward.com/awards
  • 当然。使用索引颜色调整图像大小通常不会提供良好的结果。如果您不关心保留调色板,那么您应该始终切换到 RGB,然后调整大小并(以防万一)再次减少颜色深度。
  • 谢谢罗伯托。如果它是已知方法,为什么 PIL 默认不这样做呢?
  • @Paul:因为它不再是像以前那样具有 256 调色板的索引图像。默认情况下,更改模式(甚至是调色板)几乎不是预期的行为。
【解决方案2】:

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

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

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

【讨论】:

  • 那么我很想删除 .thumbnail 并替换为 .thumbnail(size) ,如果需要,它会转换调色板,然后使用 resize 。作为 PIL 的新手,.thumbnail 似乎正是我所需要的。
  • 确实,它是 PIL 中可以改进的狡猾角落之一,但对于新用户来说也是一个有吸引力的陷阱。
  • 实际上,在使用 RGB 时,我丢失了 Alpha 通道。有什么办法可以保留吗?
【解决方案3】:

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

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

【讨论】:

  • 对不起,我剪掉了我原创的那行。但是,是的,这只是一个转换。我会尝试调整大小并进行比较。
  • 示例页面现在都是resize(),看起来还是比FF方式差很多。还有其他建议吗?
【解决方案4】:

发布的图片是indexed image。如果您通过 PIL 阅读,它的模式是 'P'Image.resize() 上有关 resample 参数的 PIL 文档指出:

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

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

正确的做法是将图像模式转换为RGB,然后使用Image.LANCZOS等高质量滤镜调整大小。顺便说一句,Image.ANTIALIAS 现在与Image.LANCZOS 相同,来源here

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

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 2017-04-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多