ユーザーが静止画像をパン/ズームできるようにしようとしています。メイン画像には選択長方形があり、「拡大」画像には別の 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」フラグはどこかにありますか?)