我有一个“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
答案 0 :(得分:1)
如果要保存为JPEG,我想另一种方法是按原样保存图像,然后通过操作EXIF元数据将旋转设置为您想要的任何值?请参阅示例this post。简单但可能有效,即使您必须将图像有效负载字节保存在内存中;)
答案 1 :(得分:1)
你可以做的事情:
进一步缩小图像(您可能不需要)
请记得在完成后立即发布所有内容
与之共存
我会选择选项2和3。
图像编辑非常耗费资源,因为它将整个原始未压缩图像数据加载到内存中进行处理。这是不可避免的,因为除了将完整的原始数据加载到存储器之外,绝对没有其他方法来修改图像。除非应用程序收到内存警告,否则内存消耗高峰并不重要,在这种情况下,在崩溃之前快速清除所有内容。但是,很少会收到内存警告,因为我的应用会定期加载一个&gt; 10 MB的文件进入内存,即使在较旧的设备上也没有收到警告。所以你会对尖刺很好。
答案 2 :(得分:0)
答案 3 :(得分:-1)
正如Anomie所提到的,CGBitmapContextCreate创建了一个上下文。我们应该通过使用
来释放它CGContextRelease(ctx);
如果您使用create或copy创建了任何其他对象,那么也应该发布它。如果是CFData,那么
CFRelease(cfdata);