更新
在进一步阅读后,我发现压缩不仅没有存储在图像标题中,而且质量数基本上没有意义,因为不同的程序对它有不同的处理方法。我仍然离开这里,以防任何人有一个非常聪明的解决方案。
我确实写了一个日志并且有一种方法写下我上次压缩图像的时间,将它与文件上的最后一次修改时间进行比较,尽管我仍然想解决获得其他图像质量的问题。 #39; t只是按时间修改。
原始问题:
我有一个小Python
脚本,可以通过某些文件夹走过,并使用枕头库将某些.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
答案 0 :(得分:1)
你在这里问不可能。 JPEG“质量”取决于两个因素。首先,对组件进行抽样。第二,选择量化表。
某些JPEG编码器具有“质量”设置,但这些设置可以执行任何操作。有些使用范围为0 .. 100其他使用0..4。我见过0..8。我见过:“高”,“中”,“低”。
您可以想象一下框架中的采样率,您可以比较量化表并将它们与您自己的一些基线表进行比较,以进行“质量”评估。
答案 1 :(得分:1)
有一种方法可以解决 。您可以使用每像素位数来检查您的jpeg压缩率。
据我所知,JPEG&#34;质量&#34; metric是0-100之间的数字,其中100表示无损,0表示最大压缩。正如你所说,实际压缩细节会因编码器和编码器而异(可能)从像素块到像素块(宏块?)。将60应用于图像会降低图像质量,但也会将文件尺寸降低,大概为原始尺寸的60%。
您的所有图片可能会有不同的尺寸。您想要看的是每像素位数。
问题是:为什么你首先要按质量因子60压缩?你的所有图片都是正确的吗?您是否尝试实现特定的文件大小?或者你只是为了让它们变得更小而感到高兴吗?
相反,如果你的目标是每个像素的特定比特数,那么你的检查只是计算文件大小除以图像中的像素数,并根据每个像素的所需位进行检查。如果它更大,则应用压缩。
当然,你必须比选择品质因数60稍微聪明一点。大概60或者意味着60%的原始文件大小或者它是一些内部设置。如果是前者,您可以简单地计算一个新值。如果是后者,您可能需要使用试用和改进来获得所需的文件大小。