0

iPhone アプリに、一部の JPEG 画像から白い背景をマスクしようとするコード スニペットがずっと前からありました。今日でも、このメッセージは iPhone では問題なく機能しますが、Apple Watch ではまったくマスクされません。コードは、予想される成功 (非NULL) パスで実行されますが、マスキングは実行されません。maskingColors配列を各コンポーネントの範囲に変更しても、0.0, 255.0マスキングは実行されません (iPhone でのこの同じ変更は、イメージを完全にマスキングします) WKInterfaceImage(with でsetImage:)。

アセット カタログに保存されているアルファ チャネルを含む PNG 画像は、Apple Watch でWKInterfaceImage.

CGImageCreateWithMaskingColorsApple 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);
}
4

1 に答える 1

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);
于 2015-04-29T18:09:30.003 に答える