创建 UIImage 抠图

Posted

技术标签:

【中文标题】创建 UIImage 抠图【英文标题】:Create UIImage cutout 【发布时间】:2012-05-09 13:53:50 【问题描述】:

我有一个 UIView 包含 2 个 UIImageViews - 一个框架和框架后面的图片。框架不是矩形 - 它是不规则的形状。用户可以操作框架后面的图片(缩放、旋转和平移),完成后,我想捕捉框架内图片的剪切 - 而不是图片和框架一起。有什么办法可以做到吗?

我已经设法将图片和框架拼合为一个图像,如下所示,但我只想要图片,如果成功提取,它将具有框架形状的边框。

- (IBAction)renderPhoto:(id)sender 
    //Combine the layers into a single image
    UIView *canvas = [[[sender superview] subviews] objectAtIndex:0];
    UIGraphicsBeginImageContext(canvas.bounds.size);
    [canvas.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *combinedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

【问题讨论】:

【参考方案1】:

使用我的这个方法..

- (UIImage*)imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)rect


    UIGraphicsBeginImageContext(photo.frame.size);/// use your screen or photo frame
    [photo.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();



    CGImageRef imageRef = CGImageCreateWithImageInRect([screenshot CGImage], rect);
    UIImage *cropped = [UIImage imageWithCGImage:imageRef];

    /*    no origin .....
    UIGraphicsBeginImageContext(tempview.frame.size);
    [[self.photo layer] renderInContext:UIGraphicsGetCurrentContext()];   
    cropped= UIGraphicsGetImageFromCurrentImageContext();    
    UIGraphicsEndImageContext(); 
    */
        return cropped;

希望对你有帮助.... :)

【讨论】:

但这只有在我想剪一个方形框架时才有效?我的框架形状不规则...... 哦,那么我认为 OpenGL ES 2.0 可以使用一些内置功能。 【参考方案2】:

您可以从您的框架中创建一个蒙版,并将此蒙版应用到目标图像上,从而从本质上将框架从目标图像中剪掉。或者,根据您最终使用最终图像的方式,在执行绘图时使用框架剪辑上下文可能更简单。

本主题涵盖了所有内容:https://developer.apple.com/library/mac/#documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_images/dq_images.html#//apple_ref/doc/uid/TP30001066-CH212-TPXREF101

第二个选项(剪切上下文)在Masking an Image by Clipping the Context下。

【讨论】:

好的...一直在看指南。只有一个问题 - 如何使用 Quartz 创建功能创建图像?然后我做类似'CGContextClipToMask(combinedImage,CGRectMake(0, 0,combinedImage.size.width,combinedImage.size.height),mask);'到我的组合图像? 可以通过 UIImage 的 CGImage 属性获取一个 CGImage。你可以通过这种方式获得你需要的 CGContext:CGContextRef cgContext = UIGraphicsGetCurrentContext(); 在你调用UIGraphicsBeginImageContext 之后。您需要在调用 CGContextClipToMask 后将目标图像绘制到上下文中(仅将帧图像传递给此,而不是组合 - 基本上,这会影响后续的绘制操作,因此它们会遗漏任何绘图框架落在哪里)。

以上是关于创建 UIImage 抠图的主要内容,如果未能解决你的问题,请参考以下文章

多个UIImage合并成一个UIImage

使用 indexPath 访问数组内的 UIImage 并创建空的 UIImage 数组元素

Swift:创建 UIImage 数组

如何在 UIImage 边界上创建阴影效果

创建特定大小的 UIImage

在主线程外创建 UIImage