在iPhone上调整图像大小,旋转和裁剪图像时,内存消耗会激增

时间:2011-06-30 23:45:44

标签: iphone ios core-graphics cgcontext

我有一个“ImageManipulator”类,可以在iPhone上执行一些裁剪,调整大小和旋转相机图像。

目前,一切都按预期工作,但我的内存消耗量不断增加,偶尔会导致应用程序崩溃。

我设法将问题隔离到代码的一部分,在那里我检查当前的图像方向属性并将其相应地旋转到UIImageOrientationUp。然后我从位图上下文中获取图像并将其保存到磁盘。

目前我正在做的事情:

CGAffineTransform transform = CGAffineTransformIdentity;
// Check for orientation and set transform accordingly...
transform = CGAffineTransformTranslate(transform, self.size.width, 0);
transform = CGAffineTransformScale(transform, -1, 1);

// Create a bitmap context with the image that was passed so we can perform the rotation
CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height,
                                         CGImageGetBitsPerComponent(self.CGImage), 0,
                                         CGImageGetColorSpace(self.CGImage),
                                         CGImageGetBitmapInfo(self.CGImage));

// Rotate the context
CGContextConcatCTM(ctx, transform);

// Draw the image into the context
CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage);

// Grab the bitmap context and save it to the disk...

即使在尝试将图像缩小到大小的一半甚至1/4之后,我仍然看到尖峰,我想知道是否有一种不同/更有效的方法来完成上述旋转?< / p>

提前感谢您的回复。 ROG

4 个答案:

答案 0 :(得分:1)

如果要保存为JPEG,我想另一种方法是按原样保存图像,然后通过操作EXIF元数据将旋转设置为您想要的任何值?请参阅示例this post。简单但可能有效,即使您必须将图像有效负载字节保存在内存中;)

答案 1 :(得分:1)

你可以做的事情:

  1. 进一步缩小图像(您可能不需要)

  2. 请记得在完成后立即发布所有内容

  3. 与之共存

  4. 我会选择选项2和3。

    图像编辑非常耗费资源,因为它将整个原始未压缩图像数据加载到内存中进行处理。这是不可避免的,因为除了将完整的原始数据加载到存储器之外,绝对没有其他方法来修改图像。除非应用程序收到内存警告,否则内存消耗高峰并不重要,在这种情况下,在崩溃之前快速清除所有内容。但是,很少会收到内存警告,因为我的应用会定期加载一个&gt; 10 MB的文件进入内存,即使在较旧的设备上也没有收到警告。所以你会对尖刺很好。

答案 2 :(得分:0)

  • 您是否尝试检查内存泄漏并分析分配?
  • 如果图像仍然太大,请尝试将图像分段而不是整体旋转。

答案 3 :(得分:-1)

正如Anomie所提到的,CGBitmapContextCreate创建了一个上下文。我们应该通过使用

来释放它
CGContextRelease(ctx);

如果您使用create或copy创建了任何其他对象,那么也应该发布它。如果是CFData,那么

CFRelease(cfdata);