iOS UIImage 剪辑到路径

Posted

技术标签:

【中文标题】iOS UIImage 剪辑到路径【英文标题】:iOS UIImage clip to paths 【发布时间】:2011-11-29 09:54:53 【问题描述】:

我正在处理用户使用 UIBezierPath 选择了其中一部分的图像。如何删除/清除/使不属于该选择的所有内容透明?

【问题讨论】:

【参考方案1】:

只有一条路很容易。只需将路径设置为剪切路径即可:

- (UIImage *)maskImage:(UIImage *)originalImage toPath:(UIBezierPath *)path 
    UIGraphicsBeginImageContextWithOptions(originalImage.size, NO, 0);
    [path addClip];
    [originalImage drawAtPoint:CGPointZero];
    UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return maskedImage;

如果你想使用多条路径的并集,那就更难了,因为 Quartz 没有任何函数可以直接计算两条路径的并集。一种方法是将每条路径一个一个地填充到一个蒙版中,然后通过蒙版绘制图像:

- (UIImage *)maskedImage

    CGRect rect = CGRectZero;
    rect.size = self.originalImage.size;
    UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0); 
        [[UIColor blackColor] setFill];
        UIRectFill(rect);
        [[UIColor whiteColor] setFill];
        for (UIBezierPath *path in self.paths)
            [path fill];
    
    UIImage *mask = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0); 
        CGContextClipToMask(UIGraphicsGetCurrentContext(), rect, mask.CGImage);
        [self.originalImage drawAtPoint:CGPointZero];
    
    UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return maskedImage;

【讨论】:

哇。没想到这么容易。我找错地方了。剪辑限制了绘图区域,对吧? 嗯,我有多个 nsbezierpath,或者如果我有一个 nsbezierpath,其中笔画相互重叠,这会搞砸。 对不起,这实际上不起作用。我有多个 UIBezierPath 不一定代表剪辑想要的形状,而是选择。剪辑有时一个重叠的多个 UIBezierPath 不会返回正确的图像。 @robmayoff 按照您的第一个示例效果很好,只是我的图像保持其原始文件大小。我无法使用 ContentMode 或更改其框架将图像调整为其内容。你知道我能做到吗? CurrentResult 这个 Swift 答案展示了如何使用 UIBezierPath 进行剪辑并获取具有 PNG 格式的 alpha 通道的图像。它还展示了如何将剪辑保存到相机胶卷以及如何将其放入粘贴板。 ***.com/questions/49853122/…【参考方案2】:

我试过联合多路径的代码,还是不行。

实际上,如果路径的并集不相互重叠,我们将一条路径附加到另一条路径并使用最终路径进行裁剪。

UIGraphicsBeginImageContextWithOptions(originalImg.size, NO, 0);
[path1 appendPath:path2]; // append path2 to path1
[path1 addClip];

[originalImg drawAtPoint:CGPointZero];
result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

【讨论】:

以上是关于iOS UIImage 剪辑到路径的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift - 在 UIImage 上画线以保存到文件

从路径获取 UIImage 仅在调试器中单步执行时有效

如何在目标c中的UILabel上显示UIImage文件路径

绘制文本并添加到 UIImage iOS 5/6

UIImage无法保存到文档文件夹ios

将UIImage保存到iOS照片库和对应程序沙盒中