我有一个从透明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(如果我能够裁剪右侧和底部的像素,这将是很棒的!)。然后它将图像的其余部分调整为我指定的矩形。不幸的是,虽然我需要剪切图像中间的图片,但我需要的尺寸能够是动态的。
现在已经挣扎了好几个小时了。有什么想法吗?
答案 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
是您的裁剪图片。