UIImage 比它的 NSData 占用更多的内存

UIImage takes up much more memory than its NSData

我正在使用以下代码从 NSData 加载 UIImage

var image = UIImage(data: data!)

但是,有一个奇怪的行为。

一开始我用的是png数据,NSData一个大概80kB

当我用数据设置UIImage时,UIImage每个占用128kb。

(用Allocation instrument检查,大小ImageIO_PNG_Data)

后来改用jpeg,NSData变成了7kb左右

但是,UIImage 每个都是 128kb,所以在显示图像时我没有内存优势! (NSData 减少到 80kb -> 7kb 而 UIImage 仍然占用相同数量的内存)

奇怪,为什么原始数据只有7kb,UIImage却要占用128kb?

我可以在不缩小 UIImage 本身大小的情况下将此内存使用减少 UIImage 吗??

请注意,我处理的不是高分辨率图像,因此无法调整图像大小(NSData 已经 7kb!!)

任何帮助将不胜感激。

谢谢!!

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

当您访问 NSData 时,它通常被压缩(使用 PNGJPEG)。当您使用 UIImage 时,有一个未压缩的像素缓冲区,通常每个像素 4 个字节(一个字节分别用于红色、绿色、蓝色和 alpha)。还有其他格式,但它说明了基本思想,即可以压缩 JPEG 或 PNG 表示形式,当您开始使用图像时,它是未压缩的。

在您的结论中,您说调整大小不是一个选项并且 NSData 已经是 7kb。如果图像的分辨率大于分辨率(bounds/frame 的点乘以图像的比例,我建议考虑调整大小 should device) 在您使用它的 UIImageView 中。是否调整大小的问题不是 NSData 大小的函数,而是视图的分辨率。因此,如果您有一张 1000x1000 像素的图像,您在 table 视图的小拇指视图中使用它,那么无论 JPEG 表示有多小,您都应该调整图像的大小。