在Python的PIL中,我如何改变图像的质量?

9

我想将图片的质量降低到几千字节以下。有什么最好的方法吗?

谢谢!

4个回答

13

如果图片格式为JPEG,以下是一个例子:

from PIL import Image
im = Image.open("C:\Users\Public\Pictures\Sample Pictures\Jellyfish.jpg")
im.save("C:\Users\Public\Pictures\Sample Pictures\Jellyfish_compressed.jpg", quality=10)

你需要阅读的参考文献包括:

  • [图像模块][1],特别是“save”函数,该函数允许您传递与每个图像格式相关的选项。
    • 每种图像格式的选项都在不同的页面中,可以在文档中找到。

PNG接受“优化”标志。您需要检查每个单独的图像格式文档,以确定可以使用哪些优化标志。 - Asim Ihsan
1
就个人而言,楼主对阅读文档并不感兴趣-他更喜欢使用 Stack Overflow。 - martineau
1
@Karl Knechtel:这可能不是最好的文档,但这个问题的答案在其中。对于im.save(),它说:“关键字选项可用于向编写器提供附加指令。如果编写器不识别选项,则会被静默忽略。可用选项稍后在本手册中描述。”然后,如果您查看JPEG附录,它说:“保存方法支持以下选项: quality-图像质量,从1(最差)到95(最佳)的比例尺。默认值为75。应避免使用高于95的值; 100完全禁用JPEG量化阶段”。 - martineau
@asim ihsan 这种压缩方式会导致图像失去方向数据,有时候图片会被保存为倒置/翻转等形式...如何保留 Exif 数据? - vijay shanker
@vijayshanker 我可以确认以这种方式使用PIL不会保留EXIF元数据。您可以使用另一个Python模块,如pyexiv2,在创建新文件后手动复制EXIF。有关更多信息,请参见:https://dev59.com/mmQn5IYBdhLWcg3wLkgd - Asim Ihsan
显示剩余2条评论

1

a) 改变大小:Image.resize(size, filter) b) 明确将其转换为JPEG格式(如果它不是)并设置所需的质量。 c) 使用a)和b)的组合

无论你做什么,都存在尺寸和质量之间的权衡。


1

已解决。

我做了...

im.save( blah, quality=5)

4
quality 只适用于 JPEG 格式,对于其他格式则忽略此选项。 - khachik

0

以下是我使用 For 循环来调整图像大小的 PIL 代码,它对我非常有效。变量 PRODUCTS 是一个包含所有产品名称的列表,但你也可以使用 readlines() 每次读取文件中的一行来实现:

def resize_images(self):
    products = PRODUCTS
    for name in products:
        try:
            fp = open(filename + name + ".jpg", "rb")
            img = Image.open(fp)
            img.load()
            img.save(filename + name + "_2" + ".jpg", quality=23)
            fp.close()
        except:
            print name 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接