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 剪辑到路径的主要内容,如果未能解决你的问题,请参考以下文章