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% でアップサンプリングします。

だから...私の質問は、これを回避する最善の方法は何だと思いますか? 1 つのオプションは、開始するために jpg を取り込まないことです。これは、[ JPG 仲介なしの ala captureStillImageAsynchronouslyFromConnection ] に対する実際の解決策です。しかし、カメラ ロールから UIImage を取得している場合、UIImage-jpg を変換するクリーンな方法はありますか? それを変換することは正しいことでもありますか(本質的にそれを行う「cacheAsBitmap」フラグはどこかにありますか?)

4

1 に答える 1

0

Apparently this isn't just a JPG issue—it's anything that's not backed by "ideal native representation", I think.

I'm having good success (significant performance improvements) with just the following:

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

For both things taken from the camera roll and from the camera.

于 2012-07-27T23:53:47.437 に答える