iOS UIImage клип на пути
Я работаю с изображением, где пользователь выбрал его часть, используя UIBezierPath. Как я могу удалить / очистить / сделать прозрачным все, что не является частью этого выбора?
2 ответа
Решение
С одним путем это очень просто. Просто установите путь в качестве обтравочного контура:
- (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();