CGImageCreateWithMaskingColors 不会在 WKInterfaceImage 的 Apple Watch 上遮罩

CGImageCreateWithMaskingColors Does Not Mask on Apple Watch in WKInterfaceImage

我的 iPhone 应用程序中早就有一段代码试图从某些 JPEG 图片中屏蔽白色背景。今天,此消息在 iPhone 上仍然有效,但在 Apple Watch 上没有任何屏蔽。该代码在预期的成功(非 NULL)路径上运行,但未执行任何屏蔽。即使我将每个组件的 maskingColors 数组更改为 0.0, 255.0 范围,当以 WKInterfaceImagesetImage:)。

带有存储在资产目录中的 alpha 通道的 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);
}

这似乎是自 iOS 7 以来就存在的问题。有关详细信息,请参阅此 post:CGImageCreateWithMaskingColors Doesn't Work with iOS7

使用该逻辑,我已按如下方式修改您的代码以产生预期结果:

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

return (anotherRendition);