UIImage占用的内存比其NSData大得多。

4
我正在使用以下代码从NSData中加载UIImage
var image = UIImage(data: data!)

然而,有一些奇怪的行为。
一开始,我使用png数据,每个NSData大约80kB。
当我使用该数据设置UIImage时,每个UIImage占用128kb。
(使用Allocation工具检查,ImageIO_PNG_Data的大小)
然后我改用jpeg,每个NSData变成了大约7kb。
但是,UIImage仍然是每个128kb,因此在显示图像时没有内存优势! (NSData减少到80kb-> 7kb,仍然需要相同数量的内存来存储UIImage)
这很奇怪,为什么UIImage应该占用128kb,而原始数据只有7kb?
我可以通过不缩小UIImage本身的情况下减少UIImage的内存使用吗?
请注意,我没有处理高分辨率图像,因此调整图像大小不是选项(NSData已经是7kb!)
将不胜感激任何帮助。
谢谢!
2个回答

4
访问NSData时,通常会使用PNGJPEG进行压缩。使用UIImage时,通常有一个未压缩的像素缓冲区,每个像素通常为4字节(分别为红、绿、蓝和alpha各1字节)。还有其他格式,但这表明了一个基本的概念,即JPEG或PNG表示可以被压缩,当您开始使用图像时,它是未经压缩的。
在您的结论中,您说调整大小不是一种选择,NSData已经有7kb了。如果图像的分辨率大于UIImageView的分辨率(即bounds / frame的点数乘以设备的比例),则我建议应该考虑调整大小。是否调整大小并不取决于NSData的大小,而是取决于视图的分辨率。因此,如果您正在使用1000x1000像素图像,并将其用于表视图中的小缩略图中,则无论JPEG表示有多小,您都应该调整图像的大小。

谢谢!我以为7kb相对于128kb太小了,而且128kb很整齐(=2^7),所以可能有什么原因..但实际上并没有!!这是我的愚蠢错误。 - kwmaeng

1
这是很正常的。当图像被存储为NSData时,它会被压缩(通常使用PNG或JPG压缩)。当它是一个UIImage时,图像会被解压缩,这使得它可以快速地在屏幕上绘制出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接