iOS 上的运行时 PNG 压缩库

Posted

技术标签:

【中文标题】iOS 上的运行时 PNG 压缩库【英文标题】:Library for run-time PNG compression on iOS 【发布时间】:2012-04-04 10:59:51 【问题描述】:

我需要能够在运行时压缩 PNG 文件,但找不到任何支持 ios 的库可以做到这一点。 JPEG 不适合我,因为我需要 PNG 提供的 Alpha 通道,而 JPEG 不需要。将 PNG crush 变成我可以在我的 iOS 项目中使用的东西可能超出了我的 C 技能/知识范围。

为了更加清楚,我需要在运行时执行此操作,而不是编译时。

【问题讨论】:

我认为这可以帮助你。 ***.com/questions/4394491/… 要保存之前的数据是什么格式的?你是否关心脱离主线程? @Malek 谢谢,但该项目侧重于调整图像大小,而不是压缩它.. @Tommy 图片以 UIImage 开始(它们是屏幕截图),需要另存为 PNG 以保留 Alpha 通道。如果我使用的任何库都可以在后台线程上运行,那将是最好的。压缩活动将发生在 NSOperation 中,如有必要,我可以将其放在主线程中。 【参考方案1】:

试试 ImageIO。见ImageIO Programming Guide

【讨论】:

感谢您指出 Image I/O - 可能对其他项目有用。对于这个项目,我希望压缩 PNG 文件,这不是 PNG 本身支持的图像格式的一部分。在 Image I/O 文档中,您可以看到没有任何 PNG 字典键提供对压缩的控制 (developer.apple.com/library/ios/#documentation/graphicsimaging/…) - 如果有,UIImagePNGRepresentation 可能会为其提供接口。 @RobReuss 我对此有点困惑; PNG是压缩的,但是有多种编码PNG的方法——因此为什么pngcrush和类似的东西通常能够通过简单地花费更多时间权衡替代方案来实现更好的压缩。所以你想要的是一种编码器,你可以告诉它花更多的时间来寻找更好的压缩比,而不是你必须信任的编码器才能使用它的默认时间/效率权衡? 对不起,如果我不清楚。你是对的——PNG 确实有压缩——但 iOS 没有公开允许你控制所使用的压缩程度的参数。我正在寻找的是一个可以构建到项目中的库,它可以让我获取 UIImage 并生成比 UIImagePNGRepresentation 生成的压缩程度更高的 PNG。如果有办法在运行时使用 pngcrush,那将满足我的需求。 PNG 对于无损图像压缩很有用,pngcrush 等工具节省空间的类型是通过蛮力搜索生成的,以查看不同的表示是否可以生成更小的文件大小。 PNG 没有像 JPEG 这样的有损格式那样的“压缩程度”设置。【参考方案2】:

你试过UIImagePNGRepresentation吗?

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIKitFunctionReference/Reference/reference.html#//apple_ref/c/func/UIImagePNGRepresentation

【讨论】:

是的,可以很好地从 UIImage 创建 PNG,但不提供任何压缩选项。 :(【参考方案3】:

如果你真的没有其他办法,也许你可以使用UIImagePNGRepresentation 以节省一个更薄的 png 文件:

// load image from the one you created
UIImage *image = [UIImage imageNamed:@"your image name"];
// give it a new PNG representation from the API
NSData *pngImage = UIImagePNGRepresentation(image);
//save it to another place
NSError *error = nil;
[pngImage writeToFile:@"your path" options:NSDataWritingAtomic error:&error];

然后看看新图像是否更薄。此方法适用于 mac:只需打开 PNG 文件并将其导出到另一个 PNG 文件即可减小其大小。

【讨论】:

我认为您可能误解了第 13.2 节。该排除的目的是证明拒绝仅以电池消耗或发热为目的的应用程序是合理的——信不信由你,人们提交了这种事情。如果使用设备的 CPU 可以带来出色的用户体验,你不应该害羞,因为它可以带来出色的用户体验 - 在 iPad 上尤其如此,因为人们不太关心保护设备的基本功能(比如 iPhone 需要拨打电话)。 不过,这是一个关于重新保存 PNG 的有趣想法 - 我严重怀疑它是否会给我我正在寻找的压缩级别,因为它只是一个副作用,但你让我很好奇我会测试它。 好的,感谢您对本节的精确描述,也许我没有听懂这件事,因为我不会说双语。至少,我没有想过人们制作这样无用的应用程序......无论如何我删除了这部分答案。请告诉我们您的测试。

以上是关于iOS 上的运行时 PNG 压缩库的主要内容,如果未能解决你的问题,请参考以下文章

压缩为 png 时位图颜色变化

使用 -jr 标志创建的 zip 在 macOS 上的解压缩方式不同,当双击与运行解压缩时

IOS图片压缩(PNG压缩 JPEG压缩 非UIImageJPEGRepresentation)

unity-iPhone 上的黑色纹理仅适用于 iOS

如何在运行时正确压缩 UIImages

mac上的iOS模拟器运行的是i386架构,不是armv7?