很久以来,我的iPhone应用程序中都曾有一段代码试图隐藏某些JPEG图像中的白色背景。如今,此消息在iPhone上仍然可以正常使用,但在Apple Watch上则无法掩盖。该代码在预期的成功(非NULL)路径上运行,但是不执行任何屏蔽操作。即使我将每个组件的maskingColors数组更改为0.0, 255.0范围,当显示在WKInterfaceImage(带有setImage:)中时,也不会执行遮罩操作(iPhone上的这一相同更改会完全遮盖图像)。

在资产目录中存储的带有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以来存在的问题。有关更多详细信息,请参见此帖子: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);

10-07 19:26
查看更多