使用边框裁剪图像

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;
    

你需要有这样的图像

请注意 蒙版图像不能有任何透明度。相反,透明区域必须是白色或介于黑白之间的某个值。一个像素越靠近黑色,它变得越不透明。

【讨论】:

以上是关于使用边框裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python(或 Perl)检测“暗”图像边框并裁剪到它?

ImageMagick 基于矩形边框颜色裁剪图像

旋转图像并裁剪黑色边框

裁剪图像python的边框

干预裁剪后的 png 图像周围的黑色边框

1.图像裁剪、加边框、旋转(Python PIL)