1

我想根据红色 View 裁剪 Image 。有几点要记住。

1.图像可以滚动和缩放。2.Red ImageView是根据Image动态创建的

 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, incX, incY

谢谢...

场景一:正常(不滚动)

在此处输入图像描述

预期结果(忽略顶部和底部的黑色边框) 在此处输入图像描述

场景二:滚动

在此处输入图像描述

预期结果(忽略顶部和底部的黑色边框)

在此处输入图像描述

场景 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 个参数,第一个是整个图像,第二个是您要裁剪的帧(所以可能是您的红色 imageView 的帧)。
问题是,如果您同时针对视网膜/非视网膜;如果您的整个图像是图像@2x,并且您想使用红色图像视图框架裁剪图像,则必须将框架加倍才能获得正确的屏幕截图。
所以你可以试试这个方法:

//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 回答