19

次のコードを使用して、スプライトから画像を取得します。また、iPhone 4 (HD バージョン) を除くすべての場所で問題なく動作します。

- (UIImage *)croppedImage:(CGRect)rect {
    CGImageRef image = CGImageCreateWithImageInRect([self CGImage], rect);
    UIImage *result = [UIImage imageWithCGImage:image];
    CGImageRelease(image);
    return result;
}

iPhone 4 は、sprite.png の代わりに HD バージョンの画像 (sprite@2x.png) を自動的に読み込みます。元の画像の縮尺は 2 ですが、結果の画像の縮尺は 1 でサイズが間違っています。

iPhone 3G[s] と iPhone 4 の異なる縮尺を考慮して、この動作をどのように処理しますか?

私はこのドキュメントを読みましたが、ここでCGImageCreateWithImageInRectを使用することについては何も言いません。

4

2 に答える 2

32

私が言えることから、CGImageCreateWithImageInRect は正しいことを行うでしょう。変更する必要があるのは、UIImage の初期化です。

http://developer.apple.com/iphone/library/documentation/uikit/reference/UIImage_Class/Reference/Reference.html#//apple_ref/occ/clm/UIImage/imageWithCGImage:scale:orientation :

に変更すると[UIImage imageWithCGImage:image scale:self.scale orientation:self. imageOrientation]、問題なく動作するはずです。(これは、これがUIImageのカテゴリであると想定しています)

于 2010-07-03T03:07:51.823 に答える
14

切り抜き四角形に画像スケールを掛ける必要があります。私の経験から、別のイメージ初期化を使用する必要はありません。

- (UIImage *)_cropImage:(UIImage *)image withRect:(CGRect)cropRect
{
    cropRect = CGRectMake(cropRect.origin.x * image.scale,
                          cropRect.origin.y * image.scale,
                          cropRect.size.width * image.scale,
                          cropRect.size.height * image.scale);

    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect);

    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];

    CGImageRelease(imageRef);

    return croppedImage;
}
于 2013-07-28T18:49:04.343 に答える