iPhone: обрезать пользовательский UIImage с помощью заданного CGPath - PullRequest
3 голосов
/ 31 августа 2009

В моем приложении для iPhone мне нужно разрешить пользователю обрезать предоставленный пользователем UIImage по заданному динамически сгенерированному CGPath.

Все, что находится вне заданного (закрытого) CGPath, должно быть вырезано, а результирующее изображение должно быть обрезано ограничивающим прямоугольником пути.

Изображение должно быть обрезано с мягкой рамкой. То есть должен быть мягкий градиент в альфа-канале по краю обтравочного контура от прозрачных до непрозрачных пикселей.

Есть ли доступное решение для достижения описанного эффекта?

Основная проблема в том, как получить этот мягкий градиент. Я думал о растеризации моего CGPath до маски и размывании его после растеризации, но я не нашел ничего относительно размытия в iPhone API & hellip;

Что касается отсечения, я планировал использовать данные CGPathGetBoundingBox, но перечитывание документации говорит мне, что в результате ограничивающий прямоугольник будет содержать контрольные точки для Безье и квадратичные кривые, что для меня неприемлемо. Что ж, старое доброе сканирование изображения на ненулевые альфа-пиксели должно выполнить эту работу.

1 Ответ

0 голосов
/ 10 августа 2015

Для ограничительной рамки используйте CGPathGetPathBoundingBox, который не включает контрольные точки.

Вы найдете фильтрацию (например, размытие) в CoreImage.

Базовое использование фильтра CoreImage (от https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-TPXREF101)

CIContext *context = [CIContext contextWithOptions:nil];
CIImage *image = [CIImage imageWithContentsOfURL:myURL];
CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"];
[filter setValue:image forKey:kCIInputImageKey];
[filter setValue:@0.8f forKey:kCIInputIntensityKey];
CIImage *result = [filter valueForKey:kCIOutputImageKey];
CGRect extent = [result extent];
CGImageRef cgImage = [context createCGImage:result fromRect:extent];

Фильтры:

https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/uid/TP40004346

...