核心图形 - 如何从UIImage中裁剪非透明像素?

时间:2013-05-17 22:32:32

标签: ios objective-c uiimage core-graphics

我有一个从透明PNG(500px乘500px)读取的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(如果我能够裁剪右侧和底部的像素,这将是很棒的!)。然后它将图像的其余部分调整为我指定的矩形。不幸的是,虽然我需要剪切图像中间的图片,但我需要的尺寸能够是动态的。

现在已经挣扎了好几个小时了。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

例如,假设您有600x600的图像。让我们说你想要从四个方面裁掉200像素。留下200x200的矩形。

因此,您将使用UIGraphicsBeginImageContextWithOptions制作200x200图形上下文。然后,您可以使用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是您的裁剪图片。