Я работаю с изображением, где пользователь выбрал его часть с помощью UIBezierPath. Как я могу удалить/очистить/сделать прозрачным все, что не является частью этого выбора?
Клип IOS UIImage к дорожкам
Ответ 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;
}
Ответ 2
Я пробовал код объединения нескольких путей, и он не работает.
Собственно, если объединение путей не перекрывается друг с другом, мы добавляем один путь к другому и обрезаем конечным путем.
UIGraphicsBeginImageContextWithOptions(originalImg.size, NO, 0);
[path1 appendPath:path2]; // append path2 to path1
[path1 addClip];
[originalImg drawAtPoint:CGPointZero];
result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();