【问题标题】:Is there a clever way to compress images to a max filesize instead of a quality level?有没有一种聪明的方法可以将图像压缩到最大文件大小而不是质量级别?
【发布时间】:2010-11-01 19:01:28
【问题描述】:

Google App Engine 对超过 1M 的图像文件感到愤怒。 http://code.google.com/appengine/docs/python/images/overview.html#Quotas_and_Limits

鉴于用户提供的任意图像,以及运行 C 代码对其进行预处理的能力,有没有什么聪明的方法可以以最高质量降低到 1M?

蛮力方法是通过尝试一系列 JPEG 质量设置和一系列比例因子来搜索生成

除了蛮力搜索之外,有什么聪明的方法来选择最佳 JPEG 质量和比例因子以实现 1M 文件大小?

什么可能是一些好的启发式方法,可能是关于在各种 JPEG 质量级别上实现的压缩百分比的假设?

蛮力具有简单的优点,无论如何它可能会足够快,但只是好奇。

【问题讨论】:

  • 为了澄清,试图在这里询问特定于 JPEG 的聪明才智,而不是像二进制搜索这样的通用搜索技术。就我的意思而言,这些仍然是“蛮力”。

标签: image image-processing jpeg libjpeg


【解决方案1】:

标准的二分搜索假设随机数据,这里肯定不是这种情况。一种更有效的方法是进行线性插值。这个功能 压缩图像的大小(未压缩图像的大小)与任何合理的函数一样,在足够小的间隔内是线性的。因此,在每次交互中,假设一个线性响应。这将比二进制搜索更快地得出答案。例如。 以 50% 质量压缩,0.75 M,因此使用 (1/.75) * 50% ~ 62%。 假设这会产生 1.5 M 的图像 现在我们有两点。 (X = 50%, Y = .75 M) 和 (X=62%, Y= 1.5 M)。斜率为 (1.5-.75)/(62-50)=.75/12 所以我们的第二个猜测是 .25M X (12/.75)=4%, 50%+4%=54% 采取迄今为止最接近的猜测,并重复该过程,直到结果让您满意为止。 您可以使用更高阶的插值,例如牛顿法,它可能会收敛得更快。

【讨论】:

    【解决方案2】:

    简单算法——创建质量为 100 的 jpeg,如果小于 1M,则使用它,如果更多,则创建 50,如果现在小于 1M,则尝试 75,否则尝试 25……

    【讨论】:

    【解决方案3】:

    尊敬的 Google AppEngine 团队:

    请取消图像文件的 1MB 上限。已经存在与存储、处理、带宽等相关的配额和定价,以维持开发人员减少文件大小的激励措施。

    感谢您所做的一切。
    真诚的,

    开发者社区

    【讨论】:

      【解决方案4】:

      Jeff Atwood 本人的这篇文章似乎暗示有一种方法可以“将 JPEG 压缩因子标准化为 15”:A Comparison of JPEG Compression Levels and Recompression(我还没有完全阅读这篇文章,所以我在阅读时可能会误解该消息凝视着它)。

      如果可以设置压缩系数,就可以设置想要的大小。

      Wikipedia article 上的桌子看起来很有趣。质量 = 50 -> 压缩系数 = 15:1(通过维基百科的经验测量证明 :-) ...我在拖延,我现在应该做点别的...)

      【讨论】:

      • 这是获得近似起始压缩级别的好方法,然后您可以继续使用此处其他答案中提到的二进制搜索算法。选择适当的最大尺寸。
      • 给 JPEG 引擎的压缩因子没有指定结果大小。从相同尺寸开始的两个图像可以在相同的压缩级别下压缩到完全不同的文件大小。 Wikipedia 中的表格仅对该示例图像有效,对其他图像无效。
      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 2012-11-30
      • 2013-09-11
      相关资源
      最近更新 更多