0

我有一个从透明 PNG(500 像素 x 500 像素)读取的 UIImage。在图像的某处,有一张我想裁剪并保存为单独的 UIImage 的图片。我还想根据新裁剪的矩形的左侧和顶部有多少透明像素来存储 X 和 Y 坐标。

我可以使用以下代码裁剪图像:

- (UIImage *)cropImage:(UIImage *)image atRect:(CGRect)rect
{
    double scale = image.scale;
    CGRect scaledRect = CGRectMake(rect.origin.x*scale,rect.origin.y*scale,rect.size.width*scale,rect.size.height*scale);

    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], scaledRect);
    UIImage *cropped = [UIImage imageWithCGImage:imageRef scale:scale orientation:image.imageOrientation];
    CGImageRelease(imageRef);
    return cropped;
}

这实际上切断了顶部和左侧的透明像素:S(如果我也能够裁剪右侧和底部的像素,那就太好了!)。然后它将图像的其余部分调整为我指定的矩形。不幸的是,虽然我需要剪切图像中间的图片并且我需要能够动态的大小。

现在已经为此苦苦挣扎了几个小时。有任何想法吗?

4

1 回答 1

2

要裁剪图像,请将其绘制到较小的图形上下文中。

例如,假设您有一张 600x600 的图片。假设您要从所有四个侧面裁剪 200 像素。剩下一个 200x200 的矩形。

因此,您将制作一个 200x200 的图形上下文,使用UIGraphicsBeginImageContextWithOptions. 然后,您将使用drawAtPoint:, 在该点绘制图像(-200,-200)。如果您考虑一下,您会发现该偏移量仅导致原始中间的 200x200 被绘制到上下文的实际边界中。因此,您已在所有四个边上将图像裁剪了 200 像素,这就是我们想要做的。

因此,这是一个通用版本,假设我们知道从左、右、上和下裁剪的数量:

UIImage* original = [UIImage imageNamed:@"original.png"];
CGSize sz = [original size];
CGFloat cropLeft = ...;
CGFloat cropRight = ...;
CGFloat cropTop = ...;
CGFloat cropBottom = ...;
UIGraphicsBeginImageContextWithOptions(
    CGSizeMake(sz.width - cropLeft - cropRight, sz.height - cropTop - cropBottom), 
    NO, 0);
[original drawAtPoint:CGPointMake(-cropLeft, -cropTop)];
UIImage* cropped = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

之后,cropped是您裁剪的图像。

于 2013-05-17T23:44:05.550 回答