【发布时间】:2011-11-29 09:54:53
【问题描述】:
我正在处理用户使用 UIBezierPath 选择了其中一部分的图像。如何删除/清除/使不属于该选择的所有内容透明?
【问题讨论】:
我正在处理用户使用 UIBezierPath 选择了其中一部分的图像。如何删除/清除/使不属于该选择的所有内容透明?
【问题讨论】:
只有一条路很容易。只需将路径设置为剪切路径即可:
- (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;
}
【讨论】:
我试过联合多路径的代码,还是不行。
实际上,如果路径的并集不相互重叠,我们将一条路径附加到另一条路径并使用最终路径进行裁剪。
UIGraphicsBeginImageContextWithOptions(originalImg.size, NO, 0);
[path1 appendPath:path2]; // append path2 to path1
[path1 addClip];
[originalImg drawAtPoint:CGPointZero];
result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
【讨论】: