首页 > 解决方案 > 将图像字节大小减少到 jpeg 以外格式的给定值

问题描述

这篇文章之后,我成功地将图像的字节大小减小到了所需的水平,但问题是我成功地只为 JPEG 做到了这一点。当我尝试为 执行此操作时png,该函数不会执行预期的操作:

def get_highest_acceptable_quality(image, filename, target):
    q_min, q_max = 1, 96
    # Highest acceptable quality found
    q_acc = -1
    while q_min <= q_max:
        m = math.floor((q_min + q_max) / 2)
        buffer = BytesIO()
        image.save(buffer, format="png", compress_level=m) 
        s = buffer.getbuffer().nbytes # the s value is always the same for all values of m

        ...

这里奇怪的是,无论 s 的值是什么,s 的值都保持不变m。JPEG 不是这种情况(这里整个函数都可以正常工作)。我完全迷失了,因为我不是图像处理方面的专家。有什么帮助吗?

标签: pythonimage-processingpython-imaging-library

解决方案


JPEG是有损的。这意味着允许更改图像像素以减小文件大小,即以绝对精度换取大小和传输时间的减小。它试图利用我们看待事物的方式,以使质量损失不那么明显。对于技术上好奇的人,我指的是“色度二次采样”,其中颜色信息被二次采样,因为人眼对亮度变化比对颜色变化更敏感,以及对“量化”,即高频变化的权重较小或被丢弃因为人眼更善于看到更广阔区域的变化,而不是在一个小的、密集的、混乱的区域中做出数千个变化 - 请参阅关于 JPEG 的维基百科文章。

PNG,另一方面,总是无损的。它不能丢弃信息或更改像素以使文件更小。最终这意味着,对于某些图像类型,它不能像 JPEG 那样减小文件大小。


推荐阅读