ios - 压缩包含带有加载图像的 UIImageView 的 NSKeyedArchiver 文件

标签 ios uiimageview png jpeg nskeyedarchiver

我有一个带有 UIImageView 的 View 。它以 jpg 或 png 图像格式加载。说 jpg 图像版本的数据大小为 100k。然后我使用 NSKeyedArchiver 将我的 View 保存到一个文件中。文件的大小约为 3MB。如果我使用图像的 png 版本,存档文件仍然在 3MB 左右。

然后我使用 zlib 压缩归档文件。但似乎并没有太大的作用。

我能做些什么来让它尽可能地回到 100k 区域?

顺便说一句:如果我使用 UIWebView 加载图像,那么使用 jpg 版本的图像我将获得非常接近原始 jpg 的存档文件。

编辑:马特的回答给了我一个想法,所以这就是我最终做的事情:

注意:我已经使用了 UIImageView 的子类

  1. 创建一个 iVar 来保存图像的 NSData
  2. encodeWithCoder调用[super encodeWithCoder...]之前,设置self.image = nil;并使用 1 中保存的 NSDataself.image 设置回图像数据。
  3. 确保将 NSData iVar 编码为 1。

initWithCoder中,使用NSData iVar恢复图像。

最佳答案

为此您不需要键控存档器。

如果图像来自您的应用程序内部,则您已经有了图像文件,因此无需保存任何内容;只需存档图像的名称。

如果图像来自互联网,那么您真正需要做的就是将原始图像保存在文件中(同样,可能会将文件的路径存档,以便您以后可以恢复它)。你有一张 JPG 图片,在某个时候是 100K,那么为什么不在你拥有它的时候直接捕捉它呢?如果它作为 NSData 到达,那么,这就是您的数据。如果没有,您可以使用 UIImageJPEGRepresentation 将其转换为 JPEG 数据。无论哪种方式,NSData 都可以直接保存到文件中。

保存(以及稍后读取)图像数据的方法是使用 ImageIO 框架。

关于ios - 压缩包含带有加载图像的 UIImageView 的 NSKeyedArchiver 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16513158/

相关文章:

ios - NSURLConnection 返回错误的缓存数据

android - Flutter - 选择 TextFormField 时键盘不显示

ios - 修复了顶部 UITableView 中的 UIImage

android - 如何在 Canvas 中使用部分图像

php - 在 PHP 中压缩 PNG 文件

android - 较小的 APK 大小和较大的 Assets ?

ios - 启动屏幕问题

ios - 在 Swift 中将子层调整为 UIView 边界

ios - 如何通过更改背景图像和更改UIImageView的位置进行动画处理

ios - UIScrollView 自动以双倍大小启动