【问题标题】:How to adjust the quality of a resized image in Python Imaging Library?如何调整 Python 图像库中调整大小图像的质量?
【发布时间】:2010-11-27 04:42:58
【问题描述】:

我正在研究 PIL,需要知道在调整图像大小或缩略图时是否可以调整图像质量。据我所知,默认质量设置为 85。可以在调整大小期间调整此参数吗?

我目前正在使用以下代码:

image = Image.open(filename)
image.thumbnail((x, y), img.ANTIALIAS)

ANTIALIAS 参数大概提供了最好的质量。我需要知道我们是否可以更详细地了解质量选项。

【问题讨论】:

    标签: python python-imaging-library


    【解决方案1】:

    手动使用 PIL 的 resize 方法:

    image = image.resize((x, y), Image.ANTIALIAS)  # LANCZOS as of Pillow 2.7
    

    后跟保存方法

    quality_val = 90
    image.save(filename, 'JPEG', quality=quality_val)
    

    查看来自 Photologue 的 models.py 的来源,看看他们是如何做到的。

    【讨论】:

    • 谢谢,这正是我要找的...只是一个补充:质量选项是一个 kwarg,所以必须作为质量=质量传递
    • 另外请注意,如果您的原始图片是indexed,在大多数情况下,如果您在调用.resize() 之前将其转换为RGBRGBA,将会提高输出质量。
    • +1 表示质量选项。但我不明白为什么resize 会比thumbnail 更好。有人可以详细说明吗?
    • @ClodoaldoNeto,没有区别。我刚刚检查了来源,thumbnail 调用了resize
    • 来自the documentationquality:图像质量,范围从1(最差)到95(最好)。默认值为 75。应避免高于 95 的值; 100 禁用部分 JPEG 压缩算法,并导致大文件几乎没有任何图像质量增益。
    【解决方案2】:

    ANTIALIAS 无法与“85”质量水平相媲美。 ANTIALIAS 参数告诉缩略图方法使用什么算法将像素从一种尺寸重新采样到另一种尺寸。例如,如果我有一个看起来像这样的 3x3 图像:

    2 2 2
    2 0 2
    2 2 2
    

    我将其调整为 2x2,一种算法可能会给我:

    2 2
    2 2
    

    因为附近的大多数像素都是2s,而另一个可能会给我:

    1 1
    1 1
    

    为了考虑到中间的0。但是你还没有开始处理压缩,直到你保存图像。也就是说,在缩略图中,您处理的不是质量等级,而是用于重采样的离散算法。所以不,你不能在这里得到更好的控制。

    如果您保存为有损压缩格式,则可以在此处指定质量级别。

    【讨论】:

    • 谢谢大家。很高兴它有帮助
    【解决方案3】:

    不要混淆重新缩放和压缩。

    为了获得最佳质量,您必须同时使用两者。见以下代码:

    from PIL import Image
    
    image = Image.open(filename)
    image.thumbnail((x, y), Image.ANTIALIAS)
    image.save(filename, quality=100)
    

    通过这种方式,我的程序中的拇指非常好。

    【讨论】:

    • "图像质量,范围从 1(最差)到 95(最好)。默认值为 75。应避免高于 95 的值;100 完全禁用 JPEG 量化阶段。" pythonware.com/library/pil/handbook/format-jpeg.htm
    • @Izzad-DinRuhulessin 链接似乎已损坏。也许你可以背诵它。
    【解决方案4】:

    实现更好质量的一种方法是分两步进行缩小。例如,如果您的原始图像是 1200x1200,并且您需要将其调整为 64x64 像素,则在第一步将其缩小到这两种尺寸中间的某个位置:

    1200x1200 -> 600x600 -> 64x64

    【讨论】:

    • 只有在您使用了较差的缩小过滤器时才会出现这种情况。
    【解决方案5】:

    抗锯齿 n 设置质量如 90

       img = img.resize((128,128),Image.ANTIALIAS)
       img.save(os.path.join(output_dir+'/'+x,newfile),"JPEG",quality=90)
    

    http://www.dzone.com/snippets/resize-thousands-images-python

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 2021-02-15
      • 2018-07-31
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2013-02-15
      • 2020-08-20
      相关资源
      最近更新 更多