【问题标题】:Compressing an NSKeyedArchiver file that included UIImageView with loaded image压缩包含 UIImageView 和加载图像的 NSKeyedArchiver 文件
【发布时间】:2013-05-06 23:05:14
【问题描述】:

我有一个带有 UIImageView 的视图。它加载了 jpg 或 png 图像格式。说 jpg 图像版本的数据大小为 100k。然后我使用 NSKeyedArchiver 将我的视图保存到文件中。文件的大小约为 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 恢复镜像。

【问题讨论】:

  • 之所以是 3MB,无疑是因为您保存的是未压缩。你的源文件是什么并不重要。 UIImage 只能理解位图,这就是您要保存的内容。正如马特所说,您为什么需要这样做?
  • 在这种情况下我确实需要使用 NSKeyedArchiver。但请参阅我的编辑。

标签: ios uiimageview png jpeg nskeyedarchiver


【解决方案1】:

您不需要为此使用密钥存档器。

如果图像来自您的应用内部,则您已经获得了图像文件,因此无需保存;只需存档图像的名称。

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

不过,灵活且强大的保存(以及稍后读取)图像数据的方法是使用 ImageIO 框架。

【讨论】:

  • 好吧,在这种情况下,我确实需要使用键控存档器......但你的回答确实提醒了我一些事情...... NSData 所以我找到了一个基于它的可行解决方案。谢谢。有兴趣可以看我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 2012-08-17
  • 1970-01-01
  • 2019-09-08
  • 2023-03-13
  • 2012-12-11
  • 1970-01-01
相关资源
最近更新 更多