我的UIImage充满了来自iPhone相机的图像。
由于图像的像素为2048x1536,因此占用了大量内存。
请不要涉及OpenGL的解决方案。
提前感谢。
答案 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而言,确实是一大块内存,而且我怀疑你能做些什么来解决这个问题(除非一次只能从磁盘上读取图像片段,但取决于你的用例,这真的可以杀死电池。)