Android bitmap couleur de masque, enlever la couleur
Je suis de la création d'image bitmap, ensuite, je suis de dessin deuxième solide bitmap de couleur sur le dessus de cela.
Et maintenant je veux changer de premier bitmap, donc solide de couleur que j'ai dessiné sur qu'il sera transparent.
Ou tout simplement, je veux supprimer tous les pixels d'une couleur de l'image.
Je havie essayé tous les colorfilter, et xfermode avec pas de chance, il n'existe aucune autre possibilité de supprimer des couleurs autres que le faire pixel par pixel?
OriginalL'auteur ZZZ | 2011-06-21
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne pour enlever une certaine couleur à partir d'une image. La partie principale est l'utilisation de AvoidXfermode. Il convient également de travailler si vous essayez de modifier une couleur à une autre couleur.
Je dois ajouter que ceci répond à la question du titre de la suppression d'une couleur à partir d'une image. La question est probablement mieux résolu à l'aide de PorterDuff Xfermode comme l'OP dit.
En regardant l'historique des modifications du code source, il semble que c'est déconseillé car il n'est pas pris en charge avec l'accélération matérielle.
OriginalL'auteur user487252
user487252 de la solution fonctionne comme un charme jusqu'à l'API de niveau 16 (Jelly Bean), après quoi
AvoidXfermode
ne semble pas fonctionner du tout.Dans mon cas d'utilisation particulier, j'ai rendu une page d'un PDF (via APV PDFView) dans un réseau de pixels
int[]
que je vais passer dansBitmap.createBitmap( int[], int, int, Bitmap.Config )
. Cette page contient la ligne d'art dessiné sur un fond blanc, et j'ai besoin de supprimer l'arrière-plan tout en préservant l'anti-aliasing.Je ne pouvais pas trouver un Portier-Duff mode qui fait exactement ce que je voulais, j'ai donc fini par le flambage et le parcours des pixels et de transformer un par un. Le résultat était étonnamment simple et performant:
C'est parfait pour le dessin, l'art en ligne, depuis n'importe quelle couleur peut être utilisé pour les lignes sans perdre l'anti-aliasing. Je suis en utilisant le canal rouge ici, mais vous pouvez utiliser verte en déplaçant
16
bits au lieu de8
, ou bleu en déplaçant24
.Vous pouvez remplacer
Color.BLACK
dans le code ci-dessus pour obtenir les différentes lignes colorées (e.g:Color.RED
, ou0xFF3399FF
).Merci beaucoup ! Fonctionne très bien
OriginalL'auteur Leo Accend
Pixel par pixel n'est pas une mauvaise option. Il suffit de ne pas appeler setPixel à l'intérieur de votre boucle. Remplir un tableau de argb ints avec getPixels, de le modifier, si vous n'avez pas besoin de conserver l'original, et ensuite appeler setPixels à la fin. Vous pouvez le faire ligne par ligne si la mémoire est un sujet de préoccupation, ou vous pouvez simplement faire la même chose en un seul coup. Vous n'avez pas besoin de remplir tout un bitmap pour votre couleur de superposition depuis que vous aviez juste faire un simple de remplacer (si le pixel est color1, mis à color2).
OriginalL'auteur Rich