我有一个用户的动画 gif 文件,大约 10mb。我希望允许用户上传它并让我将其托管在我的服务器上,但我想重新调整它以适应 5mb 的最大文件大小,以节省热链接的带宽。
我现在有一个基本方法,可以根据像素表面积确定targetWidth
和targetHeight
。
效果很好:
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 颜色/帧计数纳入该算法。谢谢
最佳答案
不确定您是否能找到一种简单的方法来做到这一点。在我看来,在不运行压缩算法的情况下预测文件的压缩大小是不确定的。
但是,如果您有足够的计算周期,则可以使用 approximation基于的方法。使用上面的算法为您提供图像的第一次调整大小。如果生成的文件大于 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
等等
关于objective-c - 投影 GIF 文件大小的算法或数学?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18158501/