如何在不更改尺寸的情况下缩小PNG图像的文件大小?

时间:2019-02-07 09:55:23

标签: python image-processing

我想使用Python减少PNG文件的文件大小。我在互联网上浏览了很多资料,但找不到任何可以在不更改尺寸即高度/宽度的情况下减小图像文件大小的地方。我发现了如何使用PIL或其他Python库来更改图像的尺寸。

如何在保持尺寸不变的情况下减小图像文件的大小?

3 个答案:

答案 0 :(得分:1)

PNG是无损格式,显然它将占用更多空间。

如果仅关注分辨率,则可以转换为任何有损格式,例如JPG。

https://whatis.techtarget.com/definition/lossless-and-lossy-compression

转换后的尺寸相同,但质量取决于所需的压缩

将PNG转换为JPG的代码段

if [message] =~ /^# .*/ { drop { } }

答案 1 :(得分:1)

PNG是无损格式,但仍可以无损方式进行压缩。 Pillow's图像类带有一个接受compress_level参数的png编写器。

很容易证明它有效:

步骤1:以.png格式加载通用的rgb lena图片:

import os
import requests
from PIL import Image
from io import BytesIO

img_url = 'http://pngnq.sourceforge.net/testimages/lena.png'
response = requests.get(img_url)
img = Image.open(BytesIO(response.content))

第2步:用compress_level=0写png:

path_uncompressed = './lena_uncompressed.png'
img.save(path_uncompressed,compress_level=0)
print(os.path.getsize(path_uncompressed))
> 691968

img_uncompressed: 691968 bytes

第3步:用compress_level=9写png:

path_compressed = './lena_compressed.png'
img.save(path_compressed,compress_level=9)
print(os.path.getsize(path_compressed))
> 406889

img_compressed: 406889 bytes

在这种情况下,可以给我们带来30%的可观压缩率,而图像质量没有任何明显的下降(对于无损压缩算法而言应该如此)。

答案 2 :(得分:0)

默认情况下,大多数PNG编写器将使用最大压缩设置,因此尝试进行更改不会有太大帮助。存在未压缩的PNG,但是它们没有任何意义,我认为您不会遇到其中的许多问题。

因此,使PNG显着减小的唯一方法是减少其存储的像素数量,或减少其存储的颜色数量。您专门说过不想减少像素数,所以另一种选择是减少颜色数。

大多数PNG文件将处于“真彩色”模式(通常每个像素24位,每个像素的红色,绿色和蓝色分量各一个字节)。但是,也可以制作索引的PNG文件。它们存储一个颜色图(也称为调色板)和每个像素一个值,即颜色图的索引。例如,如果您选择一个包含64个条目的颜色图,则每个像素将需要6位来对索引进行编码。您将存储64 * 3字节+每个像素3/4字节(当然也会压缩)。我发现this web site比较了一些示例图像,它们的外观以及减少颜色时文件的大小。

This other question显示了如何使用PIL将RGB图像转换为索引图像:

img.convert("P", palette=Image.ADAPTIVE)

尽管PIL不支持较小的颜色图,但这似乎会生成8位颜色图。 PyPNG module将允许您在颜色图中写入具有任意数量颜色的PNG文件。