使用 PIL 在 Python 中压缩 PNG 图像

Posted

技术标签:

【中文标题】使用 PIL 在 Python 中压缩 PNG 图像【英文标题】:Compress PNG image in Python using PIL 【发布时间】:2016-05-02 10:32:30 【问题描述】:

我有一个用 Selenium Builder 记录的 python 脚本,它使用以下内容获取网页的完整浏览器屏幕截图:

fileName = "Screenshot1.png"
webDriverInstance.save_screenshot(fileName)

文件大小约为 3.5 MB,因为它是一个可滚动的长页面,我需要完整的浏览器屏幕截图。我需要一种方法来压缩保存的屏幕截图,或者将它们保存为较小文件大小的 PNG 图像,以便我可以使用另一个 Python 脚本(使用 smtplib)在同一封电子邮件中附加和发送多个此类屏幕截图。

我试过了:

fileName = "Screenshot1.png"
foo = Image.open(fileName)
fileName2 = "C:\FullPath\CompressedImage.png"
foo.save(fileName2, "PNG", optimize = True)

但是,这似乎不起作用。 Screenshot1.png 和 CompressedImage.png 这两个文件大小相同(大约 3.5 MB)。

我用 save 方法尝试了几个选项,但似乎都不起作用。运行脚本时我没有收到任何错误,但文件大小也没有减少。

foo.save(fileName2, "PNG", optimize = True, compress_level = 9)
foo.save(fileName2, "PNG", optimize = True, quality = 20)

我正在使用 Python 2.7。有什么建议吗?

【问题讨论】:

您好,请查看***.com/questions/10607468/… 这行得通。谢谢! 等等...链接和你已经在做的有什么区别? 【参考方案1】:

PNG格式只支持无损压缩,压缩比通常有限,不能随意调整。

如果我是对的,有一个可变参数告诉压缩器花费或多或少的时间来寻找更好的压缩方案。但没有成功的保证。

【讨论】:

【参考方案2】:

我看到两个选项都可以使用PIL 库来实现,例如 RGB 图像。

1 – 降低图像分辨率(因此降低质量 – 您可能不希望这样做)。使用PIL提供的Image.thumbnail()Image.resize()方法。

2 – 缩小图像的颜色范围(colors 的数量会相应地影响文件大小)。这是许多在线转换器会做的事情。

img_path = "img.png"
img = Image.open(img_path)
img = img.convert("P", palette=Image.ADAPTIVE, colors=256)
img.save("comp.png", optimize=True)

【讨论】:

以上是关于使用 PIL 在 Python 中压缩 PNG 图像的主要内容,如果未能解决你的问题,请参考以下文章

在 IE9-10 中压缩 SVG 的背景大小

如何在 django python 中压缩上传的图像

如何在 Python 中压缩两个列表列表?

在python中压缩文件

在 python 中压缩文件时如何保留目录?

在Python中压缩`x if x else y`语句