python - 将图像字节大小减少到 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 不是这种情况(这里整个函数都可以正常工作)。我完全迷失了,因为我不是图像处理方面的专家。有什么帮助吗?
解决方案
JPEG
是有损的。这意味着允许更改图像像素以减小文件大小,即以绝对精度换取大小和传输时间的减小。它试图利用我们看待事物的方式,以使质量损失不那么明显。对于技术上好奇的人,我指的是“色度二次采样”,其中颜色信息被二次采样,因为人眼对亮度变化比对颜色变化更敏感,以及对“量化”,即高频变化的权重较小或被丢弃因为人眼更善于看到更广阔区域的变化,而不是在一个小的、密集的、混乱的区域中做出数千个变化 - 请参阅关于 JPEG 的维基百科文章。
PNG
,另一方面,总是无损的。它不能丢弃信息或更改像素以使文件更小。最终这意味着,对于某些图像类型,它不能像 JPEG 那样减小文件大小。
推荐阅读
- d3.js - d3 无法创建引导卡
- javascript - Cloud Firestore 查询和文档快照
- android - 使用改造获取对象数组时出现错误无法解析方法
- python - 将新的键列与值存储为字典列表中的值列表?
- javascript - 更改 JavaScript 中的样式而不影响在浏览器中呈现的内容
- javascript - 通过 API 传递正则表达式会导致错误
- python - 如何从使用 Python2 编码的 Python3 文件中检索 UTF-8 编码(来自 unicode)字符串的正确值?
- c# - 无法建立连接,因为目标计算机实际上拒绝了 127.0.0.1:1080 - tcp-client
- javascript - JavaScript $.GET 不通过
- php - php检查密码和密码确认