0

我试图让用户平移/缩放静态图像,主图像上有一个选择矩形,“放大”图像有一个单独的 UIView。

“放大”的 UIView 实现了 drawRect:

// rotate selectionRect if image isn't portrait internally
CGRect tmpRect = selectionRect;
if ((image.imageOrientation == UIImageOrientationLeft || image.imageOrientation == UIImageOrientationLeftMirrored || image.imageOrientation == UIImageOrientationRight || image.imageOrientation == UIImageOrientationRightMirrored)) {
    tmpRect = CGRectMake(selectionRect.origin.y,image.size.width - selectionRect.origin.x - selectionRect.size.width,selectionRect.size.height,selectionRect.size.width);
} 

// crop and draw
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], tmpRect);
[[UIImage imageWithCGImage:imageRef scale:image.scale orientation:image.imageOrientation] drawInRect:rect];
CGImageRelease(imageRef);

这方面的表现很糟糕。它在 [UIImage drawInRect] 上花费了 92% 的时间。

更深一点,在 ripc_AcquireImage 中为 84.5%,在 ripc_RenderImage 中为 7.5%。

ripc_AcquireImage 是 51% 的 jpg 解码,30% 的上采样。

所以......我想我的问题是避免这种情况的最佳方法是什么?一种选择是不以 jpg 开头,这是解决某些问题的真正解决方案 [ala captureStillImageAsynchronouslyFromConnection without JPG intermediary ]。但是,如果我从相机胶卷上得到一个 UIImage,比如说......有没有一种干净的方法来转换 UIImage-jpg?是否将其转换为正确的事情(本质上是否有一个“cacheAsBitmap”标志可以做到这一点?)

4

1 回答 1

0

显然,这不仅仅是一个 JPG 问题——我认为,它是任何没有“理想原生表示”支持的东西。

我在以下方面取得了很好的成功(显着的性能改进):

UIGraphicsBeginImageContext(image.size);
[image drawAtPoint:CGPointZero];
image = [UIGraphicsGetImageFromCurrentImageContext() retain];
UIGraphicsEndImageContext();

对于从相机胶卷和相机拍摄的东西。

于 2012-07-27T23:53:47.437 回答