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).

  • ¿Cómo hacer efecto de resplandor alrededor de un mapa de bits?
  • Android: ¿Cómo overlay-a-bitmap / draw-over un mapa de bits?
  • Fuga de memoria de Android: InputMethodManager, mapa de bits
  • Almacenamiento de mapa de bits para múltiples actividades?
  • Cambio de mapa de bits Drawable en LayerListDrawable
  • API básica de Android v2 MapActivity outOfMemory con 10 marcadores
  • ¿Cómo elegir el tamaño de imagen óptimo para no exceder el presupuesto de VM?
  • ¿Cómo hacer que cualquier vista dibuje a la lona?
  • Configuración de varios elementos personalizados en MultiAutoCompleteTextView: Android
  • Aplicación lenta con imagen de fondo
  • Aplicación de Android - ¿Cómo guardar un dibujo de mapa de bits en lienzo como imagen? ¿Código de verificación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.