9
votes

Comment dessiner une forme sur un uiimage tout en respectant le masque alpha de l'image

J'ai besoin d'une vision d'UiImage qui peut se dessiner en couleur ou en B / W selon un drapeau: XXX PRE>

J'essaie de le faire en dessinant un rectangle noir sur le dessus de l'original Image avec le blendmode de quartz défini sur la couleur. Cela fonctionne, sauf cela ne respecte pas le masque alpha de l'image. P>

Voir illustration: Texte alt http://img214.imageshack.us/img214/1407/convertogreyscaleillo.png P >

Recherche de Google et j'ai donc trouvé plusieurs solutions mais aucune solution de respect du masque non plus. P>

Voici le code qui produit l'image "Ce que j'obtiens" ci-dessus: P>

 - (void)drawRect:(CGRect)rect {

    if (isGrey) {
        CGContextRef context = UIGraphicsGetCurrentContext();

        // flip orientation
        CGContextTranslateCTM(context, 0, self.bounds.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);

        // draw the image
        CGContextDrawImage(context, self.bounds, self.image.CGImage);

        // set the blend mode and draw rectangle on top of image
        CGContextSetBlendMode(context, kCGBlendModeSaturation);
        CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0);
        CGContextFillRect(context, rect);       
    } else {
        [self.image drawInRect:rect];
    }
}


0 commentaires

4 Réponses :


1
votes

Bien que cela ne réponde pas directement à votre question, vous pourrez peut-être obtenir l'effet que vous recherchez à l'aide du mode kcgblendmodeluminosité Mode de blande: xxx

Aussi, le recttacle transmis à Drawrect: est la zone non valide, pas la zone entière. Vous devez utiliser les limites au lieu de


5 commentaires

Avez-vous essayé cela? Parce que cela me donne les mêmes résultats incorrects que toutes les autres choses que j'ai essayées.


Il semble - [UiImage Drawinrect:] ne prend pas en compte le mode de mélange défini sur le CGContext. J'ai mis à jour ma réponse pour utiliser cgcontextDrawimage à la place - testé et travailler :)


Avez-vous essayé ceci sur une image avec un canal alpha, avec un arrière-plan ClearColor ou un uiImageView non opaque? Votre code fonctionne sur des images non masquées, ou imageviews ayant une couleur bg opaque ou imageviews qui est opaque propriété = oui. Si l'image est comme la balle verte dans mon exemple, la couleur ne change pas en gris.


Ah oui, cela ne fonctionne vraiment que sur des arrière-plans de couleur unie. Je ne pense pas qu'il y ait une façon générale de le faire dans Coregraphics. Le plus proche que je puisse proposer le match pour définir un masque, commencer une couche de transparence, dessiner comme vous l'avez fait, puis mettre fin à la couche de transparence. Cela fonctionne dans le cas général, mais entraîne une couleur frangeant sur des zones semi-traditionnelles. Je peux poster le code si c'est utile.


Pour ce cas particulier, il est probablement plus facile de créer une copie de l'image dans l'espace colorimétrique en niveaux de gris. En général, il serait plus facile de diviser votre image dans les données de couleur (image de 24 points-ppp sans transparence) et de données de masque (image en niveaux de gris sans transparence). Cela pourrait probablement être fait au moment de l'exécution, mais serait en dehors des fonctions fournies par CoreGraphics.



0
votes

Vous pouvez essayer d'ajouter un masque à la couche d'animation principale de la vue. XXX

Une autre pensée. Pourquoi ne pouvez-vous pas simplement créer une version B & W de l'image et échanger cela en fonction de votre drapeau?


3 commentaires

Parce que je veux apprendre à résoudre le problème général de dessiner dans une image tout en respectant un canal alpha existant. Savez-vous comment faire cela?


Je vois. Semble raisonnable. Je ne sais pas comment faire ça sans faire de la recherche. Désolé.


Utilisez le mode de mélange multiplier ... juste une supposition



1
votes

Je prendrais la voie facile et dessine un cercle noir de la même taille que l'image ronde que vous avez. Probablement pas ce que vous demandez.


0 commentaires

11
votes

Pour dessiner une forme en respectant le masque alpha de l'image, il suffit d'ajouter une ligne avant de dessiner: xxx

}


1 commentaires

Sauf que cela ne fonctionne pas si votre fond de vueColor est Uicolor ClearColor.