Couleur de masque bitmap Android, supprimez la couleur

Je crée le bitmap. Ensuite, je dessine le deuxième bitmap en couleur solide. Et maintenant, je veux changer le premier bitmap, de sorte que la couleur solide sur laquelle je me dessine sera transparente.

Ou simplement, je souhaite supprimer tous les pixels d'une couleur du bitmap. J'ai essayé chaque filtre de couleur, et xfermode sans chance, existe-t-il une autre possibilité d'enlever la couleur autrement que le faire pixel par pixel?

  • Activation et désactivation des vibrations dans Android, par programme
  • ListViewDraggingAnimation cassé sur Android 5 Lollipop
  • Android ProgessBar pendant le chargement de WebView
  • Google Play Télécharger erreur 16.03.2014
  • Recycler voir l'article compléter la taille complète de la vue du recycleur après la mise à niveau de la bibliothèque de support de "23.1.1" à "23.2.1"
  • Mise en page XML Android pour tous les périphériques (Small / Normal / Large / XLarge, etc.)
  • Andengine Fade In / Out et les modificateurs alpha ne fonctionnent pas
  • Pourquoi les vues enfants at-elle hérité de la valeur alpha de la mise en page parent
  • Existe-t-il un moyen de définir Alpha à Drawable en utilisant XML?
  • Comment définir la valeur alpha pour ma mise en page Relative?
  • Png transparent sur le marché Android pour un actif haute résolution
  • Android: modifiez uniquement le texte de la TextView alpha
  • 3 Solutions collect form web for “Couleur de masque bitmap Android, supprimez la couleur”

    Cela permet de supprimer une certaine couleur d'un bitmap. La partie principale est l'utilisation de AvoidXfermode. Il devrait également fonctionner si vous essayez de changer une couleur à une autre couleur.

    Je dois ajouter que cela répond au titre de la question de supprimer une couleur d'un bitmap. La question spécifique est probablement mieux résolue en utilisant PorterDuff Xfermode comme l'OP a déclaré.

    // start with a Bitmap bmp // make a mutable copy and a canvas from this mutable bitmap Bitmap mb = bmp.copy(Bitmap.Config.ARGB_8888, true); Canvas c = new Canvas(mb); // get the int for the colour which needs to be removed Paint p = new Paint(); p.setARGB(255, 255, 0, 0); // ARGB for the color, in this case red int removeColor = p.getColor(); // store this color's int for later use // Next, set the alpha of the paint to transparent so the color can be removed. // This could also be non-transparent and be used to turn one color into another color p.setAlpha(0); // then, set the Xfermode of the pain to AvoidXfermode // removeColor is the color that will be replaced with the pain't color // 0 is the tolerance (in this case, only the color to be removed is targetted) // Mode.TARGET means pixels with color the same as removeColor are drawn on p.setXfermode(new AvoidXfermode(removeColor, 0, AvoidXfermode.Mode.TARGET)); // draw transparent on the "brown" pixels c.drawPaint(p); // mb should now have transparent pixels where they were red before 

    La solution de l'utilisateur487252 fonctionne comme un charme jusqu'au niveau API 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 tableau de pixels int[] que je vais passer dans Bitmap.createBitmap( int[], int, int, Bitmap.Config ) . Cette page contient l'art de ligne dessiné sur un fond blanc, et je dois supprimer l'arrière-plan tout en préservant l'anti-aliasing.

    Je ne pouvais pas trouver un mode Porter-Duff qui faisait exactement ce que je voulais, alors j'ai fini par flasher et itérer à travers les pixels et les transformer un par un. Le résultat a été étonnamment simple et performant:

     int [] pixels = ...; for( int i = 0; i < pixels.length; i++ ) { // Invert the red channel as an alpha bitmask for the desired color. pixels[i] = ~( pixels[i] << 8 & 0xFF000000 ) & Color.BLACK; } Bitmap bitmap = Bitmap.createBitmap( pixels, width, height, Bitmap.Config.ARGB_8888 ); 

    C'est parfait pour dessiner l'art en ligne, car n'importe quelle couleur peut être utilisée pour les lignes sans perdre l'anti-aliasing. J'utilise le canal rouge ici, mais vous pouvez utiliser le vert en déplaçant 16 bits au lieu de 8 , ou en bleu en passant 24 .

    Pixel par pixel n'est pas une mauvaise option. N'appelez pas setPixel dans votre boucle. Remplissez un tableau d'argb ints avec getPixels, modifiez-le en place si vous n'avez pas besoin de conserver l'original, puis appelez setPixels à la fin. Vous pouvez faire cette ligne par ligne si la mémoire est une préoccupation, ou vous pouvez simplement faire tout en un seul coup. Vous n'avez pas besoin de remplir un bitmap entier pour votre couleur de superposage puisque vous feriez simplement un remplacement simple (si le pixel actuel est color1, configurez à color2).

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.