4

私は一種の描画アプリを持っています。Canvas UIView のスナップショット (画面上と画面外の両方) を作成し、それを縮小したいと思います。これを行うためのコードは、iPad 3 で永遠に血まみれになります。シミュレーターには遅延はありません。キャンバスは 2048x2048 です。

これを行うべき別の方法はありますか?または、コードにミスがありますか?

ありがとうございました!

-(UIImage *) createScreenShotThumbnailWithWidth:(CGFloat)width{
        // Size of our View
    CGSize size = editorContentView.bounds.size;


        //First Grab our Screen Shot at Full Resolution
    UIGraphicsBeginImageContext(size);
    [editorContentView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

        //Calculate the scal ratio of the image with the width supplied.
    CGFloat ratio = 0;
    if (size.width > size.height) {
        ratio = width / size.width;
    } else {
         ratio = width / size.height;
    }

        //Setup our rect to draw the Screen shot into 
    CGSize newSize = CGSizeMake(ratio * size.width, ratio * size.height);

        //Send back our screen shot
    return [self imageWithImage:screenShot scaledToSize:newSize];

}
4

2 に答える 2

2

「時間プロファイラー」ツール(「製品」メニュー -> 「プロファイル」) を使用して、コード内で最も多くの時間を費やしている場所を確認しましたか? (もちろん、シミュレーターではなくデバイスで使用して、現実的なプロファイリングを行います)。質問で引用した画像キャプチャ部分ではなく、再スケーリング方法の方法にあると思いますimageWithImage:scaledToSize:

コンテキスト内でイメージ全体をレンダリングしてからイメージを最終的なサイズに再スケーリングする代わりに、コンテキストに何らかのアフィン変換を適用して、コンテキスト内のレイヤーを予想されるサイズで直接レンダリングする必要があります

したがって、 line の直後にCGContextConcatCTM(someScalingAffineTransform);on を使用して、レイヤーを別のスケール/サイズでレンダリングするスケーリング アフィン変換を適用します。UIGraphicsGetCurrentContext()UIGraphicsBeginImageContext(size);

このようにして、100% でレンダリングされてから時間のかかる方法で後で再スケーリングするのではなく、予想されるサイズで直接レンダリングされるため、はるかに高速になります。

于 2013-02-09T11:48:27.027 に答える
0

AliSoftwareに感謝します、これが私が使用することになったコードです:

    -(UIImage *) createScreenShotThumbnailWithWidth:(CGFloat)width{
        if (IoUIDebug & IoUIDebugSelectorNames) {
            NSLog(@"%@ - %@", INTERFACENAME, NSStringFromSelector(_cmd) );
        }
            // Size of our View
        CGSize size = editorContentView.bounds.size;

            //Calculate the scal ratio of the image with the width supplied.
        CGFloat ratio = 0;
        if (size.width > size.height) {
            ratio = width / size.width;
        } else {
            ratio = width / size.height;
        }
        CGSize newSize = CGSizeMake(ratio * size.width, ratio * size.height);

            //Create GraphicsContext with our new size
        UIGraphicsBeginImageContext(newSize);

            //Create Transform to scale down the Context
        CGAffineTransform transform = CGAffineTransformIdentity;
        transform = CGAffineTransformScale(transform, ratio, ratio);

            //Apply the Transform to the Context
        CGContextConcatCTM(UIGraphicsGetCurrentContext(),transform);

            //Render our Image into the the Scaled Graphic Context
        [editorContentView.layer renderInContext:UIGraphicsGetCurrentContext()];

            //Save a copy of the Image of the Graphic Context
        UIImage* screenShot = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        return screenShot;

    }
于 2013-02-12T18:58:01.373 に答える