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)
Другие вопросы по тегам