如何确定UIImage使用的字节数?

时间:2011-07-02 20:50:28

标签: ios uiimage

我希望能够计算UIImage在内存中使用的总字节数。

我可以通过将宽度乘以高度再乘以乘数字节来进行粗略估计,但我想尽可能精确地计算尺寸。

3 个答案:

答案 0 :(得分:6)

通常,对象没有单个有意义的“大小”,因为它们可以根据需要私下分配和释放任意数量的其他对象。 sizeof(*myObj)仅为您提供顶级结构的大小,而不是非常有用的数字。如果您需要分配和使用对象的完整内存影响,请在“仪器”下运行并观察分配。

对于UIImage,其实际大小是支持它的大小,通常是包含NSDataPNG的{​​{1}}加上对象高架。 (当它被渲染到屏幕或其他上下文时也有像素缓冲区;但是该缓冲区属于有问题的视图或上下文,而不是CGimageRef。如果UIImage正在进行渲染,那么缓冲很可能在GL纹理存储器中。)

UIView会为您提供与[UIImage imageWithData:[NSData dataWithContentsOfFile:@"foo.png"]]文件大小相同的UIImage,以及一些无关紧要的开销。 foo.png执行相同的操作,除了该类维护每个文件名一个对象的缓存表,并将导致该对象在低内存情况下转储其png的内存副本,将其“大小”减少到仅开销。

[UIImage imageNamed:@"foo.png"]和变体为您提供imageWithCGImage:使用UIImage引用作为其后备存储,CGImage可以是任意数量的内容,具体取决于其来源。如果你一直在绘画,它可能是一个未压缩的像素缓冲区。完全按照您的建议计算其大小。如果你需要它的大小“如果它来自文件”,请检查CGImagesUIImagePNGRepresentation函数的结果。

答案 1 :(得分:0)

宽度*高度* 4会让你靠近。我不确定是否有办法获得确切的大小,因为宽度被四舍五入到任意的,未记录的边界(至少4个像素或16个字节,我收集),并且你有几个额外的内部部分我需要数数。此外,根据其使用情况,可能还有内部属性挂在对象上。

答案 2 :(得分:0)

我必须为我正在写的推特应用程序解决这个问题。 Twitter拒绝大于3MB的图像,因此我需要将图像压缩到足以低于3MB的限制。这是我使用的代码片段:

float compression = 1.0f;
NSData* data = UIImageJPEGRepresentation(photo, compression);

while(data.length > 3145728) //3MB
{
    compression -= .1f;
    NSLog(@"Compressing Image to: %lf", compression);
    data = UIImageJPEGRepresentation(photo, compression);
    NSLog(@"Image Bytes: %i", data.length);
}

我使用的压缩算法未经优化。

那么,它在做什么?

好问题! UIImageJPEGRepresentation方法返回一个字节数组。要获得大小,只需检查数组的长度!

还有UIImagePNGRepresentation方法。请记住,这些方法必须构建字节数组,并在需要时转换数据的二进制表示。这可能需要一些时间。幸运的是,在我的情况下,iPhone拍摄的大多数图像已经不到3MB,如果有多种颜色,只需要压缩;但是反复调用UIImageJPEGRepresentation方法(这可能发生在我发布的代码中)可能需要一些时间。