使用边框裁剪图像
Posted
技术标签:
【中文标题】使用边框裁剪图像【英文标题】:Crop image using border frame 【发布时间】:2014-03-31 06:55:05 【问题描述】:我正在尝试使用矩形框裁剪图像。但不知何故无法按照要求做到这一点。
这是我正在尝试的:
这是我想要的结果:
现在我需要的是,当单击完成的图像时,应裁剪为精确放置在图像中的矩形。我已经尝试了一些东西,比如使用遮罩图像 rect 遮罩和绘制图像,但还没有成功。
这是我的代码不起作用:
CALayer *mask = [CALayer layer];
mask.contents = (id)[imgMaskImage.image CGImage];
mask.frame = imgMaskImage.frame;
imgEditedImageView.layer.mask = mask;
imgEditedImageView.layer.masksToBounds = YES;
谁能建议我更好的实现方法。
我已经尝试了很多其他的事情并浪费了时间,所以如果我能得到一些帮助,那将是非常好的和感激的。
谢谢。
【问题讨论】:
查看***.com/questions/8252779/… @Immi 我已经用正方形实现了这个东西,但是对于我想要的椭圆形,上面的屏幕不起作用 这不是我要找的。span> 你到底在寻找什么 我知道,所以,我要求您上传问题中的单独图像,以及您将其作为输出得到的内容以及您期望作为输出得到的内容,然后人们会来知道出了什么问题 【参考方案1】:- (UIImage *)croppedPhoto
// For dealing with Retina displays as well as non-Retina, we need to check
// the scale factor, if it is available. Note that we use the size of teh cropping Rect
// passed in, and not the size of the view we are taking a screenshot of.
CGRect croppingRect = CGRectMake(imgMaskImage.frame.origin.x,
imgMaskImage.frame.origin.y, imgMaskImage.frame.size.width,
imgMaskImage.frame.size.height);
imgMaskImage.hidden=YES;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
UIGraphicsBeginImageContextWithOptions(croppingRect.size, YES,
[UIScreen mainScreen].scale);
else
UIGraphicsBeginImageContext(croppingRect.size);
// Create a graphics context and translate it the view we want to crop so
// that even in grabbing (0,0), that origin point now represents the actual
// cropping origin desired:
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(ctx, -croppingRect.origin.x, -croppingRect.origin.y);
[self.view.layer renderInContext:ctx];
// Retrieve a UIImage from the current image context:
UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// Return the image in a UIImageView:
return snapshotImage;
【讨论】:
【参考方案2】:这就是你的方式
+(UIImage *)maskImage:(UIImage *)image andMaskingImage:(UIImage *)maskingImage
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGImageRef maskImageRef = [maskingImage CGImage];
CGContextRef mainViewContentContext = CGBitmapContextCreate (NULL, maskingImage.size.width, maskingImage.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
if (mainViewContentContext==NULL)
return NULL;
CGFloat ratio = 0;
ratio = maskingImage.size.width/ image.size.width;
if(ratio * image.size.height < maskingImage.size.height)
ratio = maskingImage.size.height/ image.size.height;
CGRect rect1 = 0, 0, maskingImage.size.width, maskingImage.size.height;
//// CHANGE THIS RECT ACCORDING TO YOUR NEEDS
CGRect rect2 = -((image.size.width*ratio)-maskingImage.size.width)/2 , -((image.size.height*ratio)-maskingImage.size.height)/2, image.size.width*ratio, image.size.height*ratio;
CGContextClipToMask(mainViewContentContext, rect1, maskImageRef);
CGContextDrawImage(mainViewContentContext, rect2, image.CGImage);
CGImageRef newImage = CGBitmapContextCreateImage(mainViewContentContext);
CGContextRelease(mainViewContentContext);
CGColorSpaceRelease(colorSpace);
UIImage *theImage = [UIImage imageWithCGImage:newImage];
CGImageRelease(newImage);
return theImage;
你需要有这样的图像
请注意 蒙版图像不能有任何透明度。相反,透明区域必须是白色或介于黑白之间的某个值。一个像素越靠近黑色,它变得越不透明。
【讨论】:
以上是关于使用边框裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章