2015-04-24 1 views
0

J'ai depuis longtemps un extrait de code dans mon application iPhone qui tente de masquer le fond blanc de certaines images JPEG. Aujourd'hui, ce message fonctionne toujours bien sur iPhone, mais ne masque absolument rien sur Apple Watch. Le code s'exécute sur le chemin d'accès réussi (non NULL) attendu, mais aucun masquage n'est effectué. Même si je change le tableau maskingColors à la plage 0.0, 255.0 pour chaque composant, aucun masquage n'est effectué (ce même changement sur l'iPhone masque complètement l'image) lorsqu'il est affiché dans un WKInterfaceImage (avec setImage:).CGImageCreateWithMaskingColors ne masque pas sur Apple Watch dans WKInterfaceImage

Les images PNG avec un canal alpha stockées dans un catalogue d'actifs semblent s'afficher correctement sur Apple Watch dans un WKInterfaceImage.

Est-ce que CGImageCreateWithMaskingColors n'est pas sans danger pour 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); 
} 
+0

Pouvez-vous ajouter le code de la montre (c'est-à-dire comment vous codez et définissez l'image)? –

+0

@MikeSwanson J'appelle simplement 'setData' avec le retour du code affiché sur un' WKInterfaceImage' dans une rangée d'un 'WKInterfaceTable'. Le 'NSData' que j'envoie est téléchargé depuis un site web en JPEG depuis l'application iPhone et transféré à la montre dans le bloc' reply' de 'openParentApplication'. J'ai également essayé d'effectuer l'étape de masquage sur le téléphone et d'envoyer le 'UIImagePNGRepresentation()' résultant à la montre avec les mêmes résultats. – greg

+0

Correction: setImage, pas setData évidemment. – greg

Répondre

1

Cela semble être un problème qui existe depuis iOS 7. Voir cet article pour plus de détails: CGImageCreateWithMaskingColors Doesn't Work with iOS7

En utilisant cette logique, j'ai modifié votre code comme suit pour produire le résultat escompté:

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

return (anotherRendition); 
+0

Je vais mettre le paramètre 'scale' de' UIGraphicsBeginImageContextWithOptions' à 0 au lieu de 1, mais cela fonctionne, mais il semble que ce soit un bug. – greg