3

我有一个大约 10mb 的用户动画 gif 文件。我想允许用户上传它并让我将它托管在我的服务器上,但我想重新调整它以适应最大 5mb 的文件大小,以节省来自盗链的带宽。

我现在有一个基本的方法来确定targetWidthtargetHeight基于像素表面积。

它工作得很好:

    CGFloat aspectRatio = originalHeight / originalWidth;
    CGFloat reductionFactor = desiredFileSize / originalFileSize;
    CGFloat targetSurfaceArea = originalSurfaceArea * reductionFactor;

    int targetHeight = targetSurfaceArea / sqrt(targetSurfaceArea/aspectRatio);
    int targetWidth = targetSurfaceArea / targetHeight;

它相当准确,例如。结果:一个 27mb 的文件会变成 3.3mb,或者一个 13.9mb 的文件会变成 5.5mb。

我想调整这个精度以更接近 5mb,我希望有人能更多地了解如何更好地将 gif 颜色/帧数考虑到这个算法中。谢谢

4

1 回答 1

0

不确定您是否会找到一种简单的方法来做到这一点。在我看来,在不运行压缩算法的情况下投影文件的压缩大小是不确定的。

但是,如果您有大量计算周期,则可以使用基于近似的方法。使用上面的算法为您提供图像的第一次调整大小。如果生成的文件大于 5Mb,则调整大小百分比的一半,然后重试。如果 < 5Mb 将 50% 添加到调整大小百分比,然后重试。重复直到你足够接近 5Mb。

所以,例如

50% = 3.3Mb, so try halfway between 50 and 100
75% = 6.1Mb, so try halfway between 75 and 50
62.5% = 4.7Mb so try halfway between 62.5 and 75

ETC

于 2014-03-05T23:49:22.800 回答