是否可以制作占用内存较小的UIImage?

时间:2009-10-02 05:29:31

标签: iphone iphone-sdk-3.0

我的UIImage充满了来自iPhone相机的图像。

由于图像的像素为2048x1536,因此占用了大量内存。

  1. 我希望这个图像是24位,而不是32位,但我不确定。所以这是第一个问题。图像来自iPhone相机24或32位吗?
  2. 第二个问题是:如果图像是32位,如何将它24位写入相同的内存?
  3. 第三个问题是:在将图像分配给变量以节省空间之前,我可以对此图像做什么,不改变其尺寸吗?
  4. 请不要涉及OpenGL的解决方案。

    提前感谢。

2 个答案:

答案 0 :(得分:1)

如果没有内存中的图片并创建第二个缓冲区来存储修改后的版本,那么你可以做很多事情。我相信第二个缓冲区每个颜色可以包含更少的位,甚至可以跳过alpha值。如果你选择每种颜色4比特,你就可以减掉原价50%的折扣,如果你摆脱了阿尔法的话,这就不包括了。

一组简单的调用将告诉您图片上的信息是什么,例如每种颜色的位数以及是否包含alpha:

CGImageAlphaInfo CGImageGetAlphaInfo (
   CGImageRef image
);

返回值 CGImageAlphaInfo常量,指定(1)位图是否包含alpha通道,(2)其中alpha位位于图像数据中,以及(3)alpha值是否预乘。有关可能的值,请参阅“常量”。如果图像参数引用图像蒙版,则该函数返回kCGImageAlphaNone。

size_t CGImageGetBitsPerComponent (
   CGImageRef image
);

返回值 内存中用于指定位图图像(或图像掩码)的每个颜色分量的位数。可能的值为1,2,4或8.例如,对于16位RGB(A)颜色空间,该函数将返回每个颜色分量4位的值。

size_t CGImageGetBitsPerPixel (
   CGImageRef image
);

返回值 内存中为指定位图图像(或图像掩码)的每个像素使用的位数。

这应该让你开始看到图像的组成部分。要以更少的比特重新创建它,需要更多的工作,并暂时需要更多的内存,直到你可以丢弃原始图像。

答案 1 :(得分:0)

(这不是一个真正的答案,而是更多的观察)

图片的原始数据大小将消耗大约12 MB的空间,未压缩。

2048 * 1536 = 3,145,728像素。

每个像素需要1个字节的红色数据,1个字节的绿色数据,1个字节的蓝色数据和1个字节的透明度= 4个字节/像素。

3145728 * 4 = 12,582,912字节=正好为12MB。

对于iPhone而言,确实是一大块内存,而且我怀疑你能做些什么来解决这个问题(除非一次只能从磁盘上读取图像片段,但取决于你的用例,这真的可以杀死电池。)