我想使用Python减少PNG文件的文件大小。我在互联网上浏览了很多资料,但找不到任何可以在不更改尺寸即高度/宽度的情况下减小图像文件大小的地方。我发现了如何使用PIL或其他Python库来更改图像的尺寸。
如何在保持尺寸不变的情况下减小图像文件的大小?
答案 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
第3步:用compress_level=9
写png:
path_compressed = './lena_compressed.png'
img.save(path_compressed,compress_level=9)
print(os.path.getsize(path_compressed))
> 406889
在这种情况下,可以给我们带来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文件。