Color de la máscara de mapa de bits Android, quitar el color

Estoy creando mapa de bits, a continuación, estoy dibujando segundo bitmap de color sólido en la parte superior de la misma. Y ahora quiero cambiar el primer bitmap, así que el color sólido que dibujé en él será transparente.

O simplemente, quiero quitar todos los píxeles de un color de mapa de bits. He havie probado cada colorfilter, y xfermode sin suerte, ¿hay alguna otra posibilidad para eliminar el color de otros que lo hacen pixel por píxel?

3 Solutions collect form web for “Color de la máscara de mapa de bits Android, quitar el color”

Esto funciona para eliminar un cierto color de un mapa de bits. La parte principal es el uso de AvoidXfermode. También debe funcionar si intenta cambiar un color a otro color.

Debo añadir que esto responde a la cuestión título de la eliminación de un color de un mapa de bits. La pregunta específica es probablemente mejor resuelta usando PorterDuff Xfermode como el OP dijo.

// 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 solución user487252 funciona como un encanto hasta el nivel API 16 (Jelly Bean), después de lo cual AvoidXfermode no parece funcionar en absoluto.

En mi particular caso de uso, he renderizado una página de un PDF (a través de APV PDFView) en una matriz de píxeles int[] que voy a pasar a Bitmap.createBitmap( int[], int, int, Bitmap.Config ) . Esta página contiene dibujos lineales dibujados sobre un fondo blanco, y necesito quitar el fondo mientras preservo el anti-aliasing.

No pude encontrar un modo Porter-Duff que hiciera exactamente lo que quería, así que terminé pandeando e iterando a través de los píxeles y transformándolos uno por uno. El resultado fue sorprendentemente simple y 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 ); 

Esto es perfecto para la línea de dibujo de arte, ya que cualquier color puede ser utilizado para las líneas sin perder el anti-aliasing. Estoy usando el canal rojo aquí, pero puede usar el verde cambiando 16 bits en lugar de 8 , o azul cambiando 24 .

Pixel por pixel no es una mala opción. Simplemente no llame a setPixel dentro de su bucle. Llena una matriz de argb ints con getPixels, modifica en su lugar si no necesitas conservar el original, y luego llama a setPixels al final. Usted puede hacer esto fila por fila si la memoria es una preocupación, o simplemente puede hacer todo en una sola toma. No es necesario que rellene un mapa de bits completo para el color de superposición, ya que sólo estaría realizando una sustitución simple (si el píxel actual es color1, configurado en color2).

  • Creación de un mapa de bits vacío y dibujo a través de lienzo en android
  • Cómo dibujar una porción de mapa de bits a través de lienzo DrawBitmap
  • ¿Cómo hacer efecto de resplandor alrededor de un mapa de bits?
  • Cómo rotar el mapa de bits correctamente?
  • ImageView se estrelló la aplicación
  • Cómo combinar el mapa de bits de superposición y la imagen capturada en android?
  • Android fuera de la prevención de la memoria
  • Android, ayuda a girar la imagen en el tacto
  • Cómo convertir un dibujable a un mapa de bits?
  • Bitmap, Bitmap.recycle (), WeakReferences y Garbage Collection
  • Cambio de mapa de bits Drawable en LayerListDrawable
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.