我有一个UIImage,其由透明的PNG(500像素500像素)读出。 某处的形象,还有就是我想裁剪掉,并保存为独立的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上。 然后,将图像大小调整到我指定的矩形休息。 但不幸的是我需要削减的图片是在图像的中间,我需要的大小要能是动态的。
用了现在这个挣扎了好几个小时。 有任何想法吗?
要裁剪图像,绘制成更小的图形上下文。
例如,假设你有一个600×600的图像。 让我们说你要裁剪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
是你裁剪图像。