找到图像最佳压缩级别的最快方法

2024-05-11 06:50:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python编写了一个函数,它以一定的质量级别(0到100,越高越好)保存图像。根据质量级别,最终文件的大小(以字节为单位)

我需要编写一个函数,为图像选择尽可能最佳的质量级别,并将其保持在最大文件大小下(以字节为单位)。我唯一能做的就是尝试

最简单的方法是:以一定的质量保存文件,如果文件比预期的大,则降低质量,以此类推。 不幸的是,这种方法非常耗时。即使我在每次迭代中将质量降低了5个点,风险是我必须在找到正确的质量之前将同一个文件保存21次

另一个解决方案是:尝试使用之前质量的一半,并根据结果关注较低的质量范围或较高的质量范围。 让我澄清一下:

  1. 假设质量可以在0到100之间,尝试使用质量=50
  2. 如果文件大小高于预期,则关注较低的质量范围(例如0-49),否则关注较高的质量范围(例如51-100)在所考虑的范围内设置质量值并保存文件(例如,如果较低的范围为25,如果范围较高,则为75);返回到2
  3. 范围小于5时退出

第二个解决方案始终需要6次迭代

这里是一个Python实现:

limit_file_size = 512 # maximum file size, change this for different results

q_max = 100
q_min = 0
quality = q_min + (q_max - q_min) // 2

while True:
    file_size = save_file(quality)

    if (q_max - q_min) <= 5: break

    if file_size > limit_file_size:
        q_max = quality
    else:
        q_min = quality

    quality = q_min + (q_max - q_min) // 2

请注意,函数save_file不是为了简洁而提供的,它的伪实现可以是:

import math
def save_file(quality):
    return int(math.sqrt(quality))*100

如何减少上述函数收敛到有效解所需的周期数


Tags: 文件方法函数图像size字节save质量
2条回答

您可以尝试执行如您所述的二进制搜索功能,并将结果保存在字典中,以便下一次迭代时,它将检查文件大小质量是否已按如下方式计算:

# { file_size : quality }
{ 512 : 100 , 256 : 100, 1024 : 27 }

请注意,每个图像都有不同的尺寸、颜色深度、格式等,因此您可能会得到一系列结果,我建议您使用它并在影响最大的属性中创建子关键点,例如:

{ format : { file_size : quality } }

您可以使用某种简单的ML(机器学习)方法。给定的列车模型:

  • 图像质量大小50
  • 限制文件大小

因为输入将产生您所寻求的最佳质量,或者至少缩小搜索范围,以便您需要2-3次迭代,而不是6次

因此,您必须收集培训(和验证)数据,培训简单快速的模型(应该比save_file更快)

我认为这是尽可能快地确定质量的最佳方法,但需要大量工作(特别是如果您没有ML方面的经验)

相关问题 更多 >