1

赤い View に従って Image をトリミングしたい。注意すべき点がいくつかあります。

1.画像のスクロールとズームが可能です。2.赤いImageViewは、画像に応じて動的に作成されます

 UIImage* whole = [UIImage imageNamed:@"9.png"]; //I uses this image
 CGImageRef cgImg = CGImageCreateWithImageInRect(whole.CGImage, CGRectMake(x, y, incX, incY));
 UIImage* part = [UIImage imageWithCGImage:cgImg];

の値を見つける方法を知りたいだけです

x、y、インクX、インクY

ありがとう...

シナリオ 1: 通常 (スクロールしない)

ここに画像の説明を入力

期待される結果 (上下の黒い枠を無視) ここに画像の説明を入力

シナリオ 2:スクロール

ここに画像の説明を入力

期待される結果 (上下の黒い枠を無視)

ここに画像の説明を入力

シナリオ 3: ズーム

ここに画像の説明を入力

ズームされたものと同じ期待される結果。

いずれの場合も、赤い四角形の中にそれぞれの画像が必要です。

これらすべてについて、私はこのコードを使用しています...

    -(void)cropClicked:(UIButton*)sender
    {
        float zoomScale = 1.0 / [mainScrollView zoomScale];
        CGRect rect;
        rect.size.width = [redImageView bounds].size.width * zoomScale ;
        rect.size.height = [redImageView bounds].size.height * zoomScale ;
        rect.origin.x = ([mainScrollView bounds].origin.x + redImageView.frame.origin.x );
        rect.origin.y = ([mainScrollView bounds].origin.y + redImageView.frame.origin.y );

        CGImageRef cr = CGImageCreateWithImageInRect([[mainImageView image] CGImage], rect);
        UIImage *cropped = [UIImage imageWithCGImage:cr];
        mainImageView.image=cropped;
        UIImageWriteToSavedPhotosAlbum(cropped, nil, nil, nil);
        CGImageRelease(cr);
    }
4

2 に答える 2

1

まあ、@HDdeveloper が正しく言ったように、使用できますCGImageCreateWithImageInRect。これは2つのパラメータを取ります.1つ目は画像全体、2つ目はトリミングしたいフレームです(おそらく赤いimageViewのフレームです)。
問題は、網膜/非網膜の両方をターゲットにしている場合です。画像全体が画像@2xで、画像を赤いimageviewフレームでトリミングしたい場合は、フレームを2倍にして正しいスクリーンショットを取得する必要があります。
したがって、次の方法で試すことができます。

//Define the screen type:
#define isRetinaDisplay [[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0)

- (UIImage*)cropInnerImage:(CGRect)rect {
    //Take a screenshot of the whole image
    UIGraphicsBeginImageContextWithOptions(self.view.frame.size, NO, 0.0);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage* ret = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    CGRect rct;
    //Double the frame if you're in retina display
    if (isRetinaDisplay) {
        rct=CGRectMake(rect.frame.origin.x*2, rect.frame.origin.y*2, rect.size.width*2, rect.size.height*2);
    } else {
        rct=rect;
    }
    //Crop the image from the screenshot
    CGImageRef imageRef = CGImageCreateWithImageInRect([ret CGImage], rct);
    UIImage *result = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    //Save and open the result images with Preview.app
    [UIImagePNGRepresentation(result) writeToFile: @"/tmp/testCrop.png" atomically: YES];
    system("open /tmp/testCrop.png");
    [UIImagePNGRepresentation(ret) writeToFile: @"/tmp/testRet.png" atomically: YES];
    system("open /tmp/testRet.png");
    //
    return result;
}

パラメータrectは赤い画像フレームでself.view.frameなければならず、 と等しくなければなりませんwholeImageView.frame。最後の 4 行はスキップできます。これらは、Mac で何を切り抜いているかを確認するためのものです。

PS: このメソッドを使用して画像をトリミングし、UIView の背景として設定しframeます。

于 2012-11-30T10:07:40.420 に答える
0

CGImageRef を使用して、画像全体で四角形を渡すことができます。次に、ボタンのクリックでこれを呼び出します

UIImage* whole = [UIImage imageNamed:@"9.png"]; //I uses this image
    CGImageRef cgImg = CGImageCreateWithImageInRect(whole.CGImage, CGRectMake(x, y, incX, incY));
    UIImage* part = [UIImage imageWithCGImage:cgImg];
于 2012-11-30T08:48:04.480 に答える