【发布时间】:2011-06-30 23:45:43
【问题描述】:
我有一个“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 之后,我仍然看到尖峰,我想知道是否有其他/更有效的方法来完成上述旋转?
提前感谢您的回复。 罗格
【问题讨论】:
-
图片有多大?我们遇到了类似的问题,所以我们首先将图像缩小到可接受的尺寸,然后应用旋转。
-
您是否在冗长的操作中创建大型自动释放对象?
-
内存峰值是因为
CGBitmapContextCreate必须分配一个缓冲区来保存图像数据,这大约是width * height * CGImageGetBitsPerComponent(self.CGImage) / 8字节。如果CGContextDrawImage需要在绘制之前加载或解压缩原始图像的图像数据,它也可能分配另一个类似大小的缓冲区。不过,我不知道有什么更有效的方法。
标签: iphone ios core-graphics cgcontext