读取 jpeg 压缩质量

Read jpg comression quality

更新:

进一步阅读后,我发现压缩不仅没有存储在图像中 header,而且质量数字基本上没有意义,因为不同的程序有不同的处理方法。我仍然把它留在这里,以防有人对问题有一个非常聪明的解决方案。

我确实写了一个日志,并且有一种方法写下我上次压缩图像的时间,将它与文件上的最后修改时间进行比较,尽管我仍然想解决其他图像的质量问题我不能只按时间修改。

原题:

我有一个小的 Python 脚本,它遍历某些文件夹并使用 pillow 库将某些 .jpg 文件压缩到 60 质量。

它可以工作,但是在第二次迭代中它会压缩所有已经压缩的图像。

那么有没有办法获得 .jpg 当前具有的压缩或质量,以便我可以跳过已经压缩的文件?

import os
from os.path import join, getsize
from PIL import Image

start_directory = ".\test"

for root, dirs, files in os.walk(start_directory):
    for f in files:

        try:
            with Image.open(join(root, f)) as im:
                if im.quality > 60: # <= something like this
                    im.save(join(root, f),optimize=True,quality=60)
            im.close() # <= not sure if necessary
        except IOError:
            pass

你问的是不可能的事情。 JPEG "quality" 取决于两个因素。首先,组件的采样。二、量化表的选择

一些 JPEG 编码器有 "quality" 设置,但这些设置无所不能。一些使用范围为 0 .. 100 其他使用 0..4。我见过0..8。我看过:"high"、"Medium"、"Low."

您可以想像地查看帧中的采样率,您可以比较量化表并将它们与您自己的一些基线表进行比较以进行 "quality" 评估。

这个可能有办法解决。您可以使用 每像素位数 来检查您的 jpeg 压缩率。

据我了解,JPEG "quality" 指标是 0-100 之间的数字,其中 100 表示无损,0 表示最大压缩。正如您所说,实际的压缩细节因编码器而异,并且(可能)因像素块而异(宏块?)。将 60 应用于图像会降低图像质量,但也会将文件 大小 减小,大概是其原始大小的 60%。

您所有的图片可能都有不同的尺寸。您想要查看的是 位每像素

问题是:为什么首先要以品质因数 60 进行压缩?它对你所有的图像都是正确的吗?您是否要达到特定的文件大小?或者你只是为了让它们变小而高兴?

相反,如果您的目标是每像素的特定位数,那么您的检查只是计算文件大小除以图像中的像素数,然后根据您想要的每像素位数进行检查。如果它更大,应用压缩。

当然,你必须比选择品质因数 60 稍微聪明一些。大概 60 意味着原始文件大小的 60% 或者它是一些内部设置。如果是前者,您可以简单地计算出一个新值。如果是后者,您可能需要通过试用和改进才能获得所需的文件大小。