使用 PIL 在 Python 中压缩 PNG 图像

smi*_*hra 7 selenium python-imaging-library python-2.7 selenium-webdriver

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

fileName = "Screenshot1.png"
webDriverInstance.save_screenshot(fileName)
Run Code Online (Sandbox Code Playgroud)

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

我试过这个:

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

但是,这似乎不起作用。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)
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*Web 7

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

\n

1 \xe2\x80\x93 降低图像分辨率(因此质量 \xe2\x80\x93 您可能不希望如此)。使用PIL提供的Image.thumbnail()or方法。Image.resize()

\n

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

\n
img_path = "img.png"\nimg = Image.open(img_path)\nimg = img.convert("P", palette=Image.ADAPTIVE, colors=256)\nimg.save("comp.png", optimize=True)\n
Run Code Online (Sandbox Code Playgroud)\n


mil*_*ani 0

PNG格式仅支持无损压缩,其压缩比通常受到限制且不能自由调整。

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