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

  • Recortar el área de ruta seleccionada desde la vista de imagen personalizada
  • Mat to Bitmap en el archivo jni cpp de Android
  • Desvanecer el borde de la imagen en una vista de imagen
  • Cómo almacenar (imagen de mapa de bits) y recuperar la imagen de la base de datos sqlite en android?
  • Spritesheet programa de corte: las mejores prácticas
  • Deslizar para eliminar con rotación
  • Escala de mapa de bits a 80 por ciento
  • Dando dibujo / Pintura / Ahorro de múltiples mapas de bits
  • Android - comprimir mapa de bits antes de guardarlo en SDCARD en actividad para obtener resultados
  • Cómo corregir "lienzo: intentando utilizar un error de mapa de bits reciclado"?
  • android convertir mapa de bits a bufferedinputstream
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.