iOS цвет к прозрачному в UIImage
Как очистить пурпурную часть UIImage и сделать ее прозрачной?
Я просмотрел многочисленные ответы и ссылки на SO, и ничего не работает (например, Как сделать один цвет прозрачным на UIImage? Ответ 1 удаляет все, кроме красного, ответ 2, очевидно, не работает из-за Почему CGImageCreateWithMaskingColors() возвращает nil в это дело?).
Обновить:
Если я использую CGImageCreateWithMaskingColors с UIImage, я получаю нулевое значение. Если я удаляю альфа-канал (я представляю изображение в формате JPEG и читаю его обратно), CGImageCreateWithMaskingColors возвращает изображение, закрашенное черным фоном.
Update2, код:
Возвращая ноль:
const float colorMasking[6] = {222, 255, 222, 255, 222, 255};
CGImageRef imageRef = CGImageCreateWithMaskingColors(anchorWithMask.CGImage, colorMasking);
NSLog(@"image ref %@", imageRef);
// this is going to return a nil imgref.
UIImage *image = [UIImage imageWithCGImage:imageRef];
Возвращаем изображение с черным фоном (что нормально, так как нет альфа-канала):
UIImage *inputImage = [UIImage imageWithData:UIImageJPEGRepresentation(anchorWithMask, 1.0)];
const float colorMasking[6] = {222, 255, 222, 255, 222, 255};
CGImageRef imageRef = CGImageCreateWithMaskingColors(inputImage.CGImage, colorMasking);
NSLog(@"image ref %@", imageRef);
// imgref is NOT nil.
UIImage *image = [UIImage imageWithCGImage:imageRef];
Update3:
Я получил его, добавив альфа-канал после процесса маскировки.
3 ответа
UIImage *image = [UIImage imageNamed:@"image.png"];
const float colorMasking[6] = {1.0, 1.0, 0.0, 0.0, 1.0, 1.0};
image = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(image.CGImage, colorMasking)];
Вы получаете ноль, потому что отправленные вами параметры неверны. Если вы откроете документацию Apple, вы увидите это:
Компоненты
Массив цветовых компонентов, которые задают цвет или диапазон цветов для маскирования изображения. Массив должен содержать 2N значений { min[1], max[1], ... min[N], max[N] }, где N - количество компонентов в цветовом пространстве изображения. Каждое значение в компонентах должно быть допустимым значением образца изображения. Если изображение имеет целочисленные пиксельные компоненты, то каждое значение должно находиться в диапазоне [0 .. 2**bitsPerComponent - 1] (где bitsPerComponent - это число бит / компонент изображения). Если изображение имеет пиксельные компоненты с плавающей точкой, то каждое значение может быть любым числом с плавающей точкой, которое является допустимым компонентом цвета.
Вы можете быстро открыть документацию, удерживая Option + щелчок мыши по какой-либо функции или классу, например CGImageCreateWithMaskingColors.
Я сделал эту статическую функцию, которая удаляет белый фон, которую вы можете использовать, заменив маску цветовой гаммой, которую вы хотите удалить:
+ (UIImage*) processImage :(UIImage*) image
{
const float colorMasking[6]={222,255,222,255,222,255};
CGImageRef imageRef = CGImageCreateWithMaskingColors(image.CGImage, colorMasking);
UIImage* imageB = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return imageB;
}
Я сделал это в CIImage с постобработкой из Vision в виде пиксельного буфера:
let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
let filteredImage = ciImage.applyingFilter("CIMaskToAlpha")
self.picture.image = UIImage(ciImage: filteredImage)