如何针对特定目标文件大小优化图像大小?

Posted

技术标签:

【中文标题】如何针对特定目标文件大小优化图像大小?【英文标题】:How can I optimize UIImage resizes for a specific target filesize? 【发布时间】:2012-06-25 01:34:57 【问题描述】:

对于任何给定的文件数据大小,我希望能够调整(或压缩) UIImage 的大小以适应该数据限制。这个问题不是关于如何调整大小或如何检查文件大小的问题......它是关于一种以高性能方式获得它的算法。

已经在这里搜索,我找到了this thread,它谈到了以线性或二进制算法降低图像 jpeg 质量。这不是很高效,最多需要几十秒。

我在 ios 上工作,因此图像可以接近 10MB(来自 iPhone 4S)。我的目标虽然可变,但目前是 3145728 字节。

我目前正在使用UIImageJPEGRepresentation 进行一点压缩,但要达到我的低目标,对于这么大的照片,我似乎不得不损失很多质量。 UIImage 大小和NSData 大小之间有关系吗?是否有一些功能可以让我说:

area * X = dataSize

...求解一个比例因子,以便我可以一次性调整大小?

【问题讨论】:

使用 JPEG 压缩,它肯定取决于图像的性质,即具有大量高频信号(即锐边)的图像会比没有的图像大。因此,如果不实际执行压缩,将很难提前知道。 有一个好的大致估计吗? png呢? 即使使用 PNG,它也将取决于图像的性质。我猜图像大小为 10MB,您正在处理照片或自然图像 - 而 PNG 将是非常垃圾的。我能想到的唯一可以提前知道大小的格式是 BMP 或类似的未压缩格式。但是你当然会失去压缩的好处。 如何使用不同尺寸的非常复杂的样本图像设置预先计算的基准。您可以获取不同场景的压缩比大致数据,并将它们用作需要压缩和调整大小的指南。 【参考方案1】:

在查看您链接到的线程后,我有一个想法:压缩 10MB 的图像会相对较慢。如何将大小调整为更小(以便压缩更快),然后执行压缩算法(来自链接)。那么这可以作为压缩10MB图像大小的指导吗?这个想法是相同图像的压缩率应该相似,与大小无关。

假设 1000x1000 像素压缩后为 10MB,目标大小为 3MB。

然后说以相同质量压缩的较小的 100x100 像素(例如)是 C MB。然后在 100x100 图像上执行二分搜索算法,直到 size = C * (3/10)。然后对 1000x1000 的图像使用这种压缩质量来获得大约 3MB 的图像。

注意:我不知道这将如何运作 - 这只是一个建议。为较小尺寸的图像选择什么尺寸(我使用 100x100)也只是一个猜测,需要进行一些试验。

【讨论】:

我应该如何确定将其缩小到哪个尺寸?如果我可以半准确地衡量这一点,那么就不需要迭代了吗? 这样设置,好像JPG的压缩效果还是不错的。以前,我在 1.0 中一直使用无压缩。在测试和设置时,我发现下降到 0.9 会导致文件大小下降 54%。 0.8 => 60%、0.7 => 66%、0.6 => 77% 的文件大小更小。这一切都没有可察觉的质量损失。甚至 Photoshop 也将 High JPEG Quality 设置为 60,所以我想我将其设置为 0.6 并忘记它。将此答案标记为正确,因为它引导我找到适合我情况的正确答案。

以上是关于如何针对特定目标文件大小优化图像大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ant 目标中使用文件大小

如何使用 iOS 轻松调整/优化图像大小?

优化从相机胶卷中挑选的图像以减小文件大小

键入时查找文件的大小

特定分辨率的可绘制文件夹的不同图像大小

Coldfusion调整大小使图像文件更大?