如何使用特定文件大小保存图像?

Jes*_*ord 23 php image image-processing image-compression

我正在构建一个PHP系统,用户可以创建一个视觉上复杂的图像,最终要求为50kB或更低.

用户可以选择将文本打印到37个模板图像中的一个上,因此结果是单个平面图像.

文本可以是任何颜色和多种字体之一.这意味着最终图像可能非常复杂且不可预测(图像尺寸除外).

然后,我要求最终图像文件大小不超过50kB(这是一个外部要求,不能更改).

最后一个要求(同样是外部)是图像格式必须是.jpeg,.png或.gif.

我查看了GraphicsMagick文档,但无法找到任何能够设置文件大小并自动计算压缩的地方.

我已经考虑通过compress-> save->测试循环以编程方式执行此操作,但是我可以想象这将是处理器密集型的,因为我不一定能提前基于压缩来计算文件大小.这就是为什么我要问看看这个问题是否已经在GraphicsMagick中解决了.

编辑

要明确为什么有外部要求:

用户将利用该系统创建一个平面图像,然后将其保存到PC上.然后,此图片将上传到Adroll,以便在重定向广告系列中使用.

以下是Adroll对图像的要求.我的系统仅提供728x90,300x250和120x600图像尺寸.

编辑 2010年11月27日

由于GraphicsMagick似乎无法做到这一点,我愿意研究其他解决方案,例如直接与可能提供功能的压缩库(libpng等)接口.

作为最后的手段,我甚至可以看到能够实现这一目标并自己实现的算法.


作为类比,对于那些倾向于这样的人:

我追求A*的搜索:它有一个明确的起点/终点,并在最快的时间内找到最佳路线.

我希望避免的是广度/深度优先搜索:明确的起点/终点,但一旦找到局部最小值,可能不会达到最优解,并且有可能在计算上完全爆发.

Jon*_*Jon 11

由于没有办法压缩到我所知道的目标大小,我建议寻找间接解决方案:

  1. 做一些快速统计(可能通过压缩大量具有不同JPEG压缩因子的图像)来找出给定质量水平的平均压缩尺寸及其标准偏差.
  2. 接受图像时,请尝试以合适的质量进行压缩.如果生成的文件太大,请降低质量并重试.可选地,如果结果太小,您也可以提高质量.
  3. 当生成的图像"接近"目标大小时停止,但更小.

要详细说明第2步中的数学:

如果您选择起始质量使得您的平均计算尺寸+ 3*标准偏差<您的目标尺寸,那么99.7%的压缩将在第一次尝试时产生适当的小文件(假设压缩尺寸的正态分布).

您可以根据需要调整起始质量和增加或减少它的逻辑,在较少的服务器负载和接近最大大小的文件之间进行平衡("更好地利用"您的限制).


zaf*_*zaf 9

看看下面的包:

http://www.phpclasses.org/package/3810-PHP-Optimize-images-to-fit-in-a-given-file-size-limit.html

非常酷 - 我说作者值得喝啤酒;)

示例图像实际上是61081字节(第一个jpeg图像显示图像中的文件大小?):

替代文字


cwe*_*ske 0

我不知道有什么方法可以自动确定图像的最终文件大小 - 这是生成图像的库的任务。除非您自己实现压缩,否则无法预先计算结果大小。

您可以做的是收集统计数据(图像高度和宽度以及文件大小与不同的压缩选项),并根据新图像的数据进行估计。

例子:

  • 50k jpg,100x200压缩30k
  • 100k jpg,100x200 压缩为 60k

-> 当你得到一个 59k 的 100x202px 图像时,压缩后的大小将大致估计为 35k。