CGImageCreateWithMaskingColors не маскируется на Apple Watch в WKInterfaceImage

У меня уже давно есть фрагмент кода в приложении для iPhone, который пытается замаскировать белый фон из некоторых изображений JPEG. Сегодня это сообщение все еще хорошо работает на iPhone, но никак не маскирует Apple Watch. Код выполняется в ожидаемом успешном (неNULL) путь, но маскирование не выполняется. Даже если я изменю maskingColors массив в диапазон 0.0, 255.0 для каждого компонента маскирование не выполняется (это же изменение на iPhone полностью маскирует изображение) при отображении в WKInterfaceImagesetImage:).

Изображения в формате PNG с альфа-каналом, хранящиеся в каталоге ресурсов, по-видимому, правильно отображаются на Apple Watch в WKInterfaceImage,

Является CGImageCreateWithMaskingColors не безопасно для Apple Watch?

- (UIImage *)imageWithBackgroundRemovedWithImageData:(NSData *)imageData
{
    CGImageRef originalImage = [UIImage imageWithData:imageData].CGImage;

    /* Only attempt for RGB images */
    if (CGColorSpaceGetModel(CGImageGetColorSpace(originalImage)) != kCGColorSpaceModelRGB)
        return ([UIImage imageWithData:imageData]);

    /* Mask 10 shades of "white" */
    static const CGFloat maskingColors[] = {245.0, 255.0, 245.0, 255.0, 245.0, 255.0};
    CGImageRef transparentImageRef = CGImageCreateWithMaskingColors(originalImage, maskingColors);
    if (transparentImageRef == NULL)
        return ([UIImage imageWithData:imageData]);

    UIImage *transparentImage = [UIImage imageWithCGImage:transparentImageRef];
    CGImageRelease(transparentImageRef);
    return (transparentImage);
}

1 ответ

Решение

Похоже, что это проблема, которая существует со времен iOS 7. См. Этот пост для получения дополнительной информации: CGImageCreateWithMaskingColors не работает с iOS7

Используя эту логику, я изменил ваш код следующим образом, чтобы получить ожидаемый результат:

UIGraphicsBeginImageContextWithOptions(transparentImage.size, NO, 1.0);
[transparentImage drawInRect:CGRectMake(0, 0, transparentImage.size.width, transparentImage.size.height)];
UIImage *anotherRendition = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return (anotherRendition);
Другие вопросы по тегам