Pregunta

Trabajo en Android (1.5), que tiene un centenar de imágenes en escala de grises en forma de matrices de bytes. Quiero usar las imágenes como alfa máscaras para la elaboración de colores sólidos en un lienzo. Las imágenes son fijos pero los colores pueden cambiar. Puedo crear objetos de mapa de bits para cada combinación de imagen / color, pero que parece terriblemente ineficiente. Lo que sería una buena manera de abordar este problema, tanto en términos de memoria y la velocidad? (Tengo que hacer esto muchas veces para cada imagen / combinación de colores.)

¿Fue útil?

Solución

Creo que he encontrado la respuesta que estaba buscando:

  1. Crear un mapa de bits ARGB_8888 donde cada color se establece en píxeles (gris << 24) | 0xFFFFFF.
  2. Para cada color, crear un nuevo PorterDuffColorFilter (color, PorterDuff.Mode.MULTIPLY).
  3. Para render, crear un objeto de pintura y setColorFilter call () con el filtro correspondiente al color que se utilizará. A continuación, llamar canvas.drawBitmap utilizando el mapa de bits y objetos pintura.

Para un solo color, esto probablemente no es tan rápido como la construcción de exactamente el mapa de bits que quiero y dibujo sin un objeto de pintura, pero es mucho más eficiente que el espacio de un mapa de bits para cada imagen / combinación de colores.

Otros consejos

contraste flotador = 100 / 180.f; escala flotador = contraste + 1.f;

        cm.set(new float[] {
               scale, 0, 0, 0, 0,//Red
               0, 1.5f, 0, 0, 0,//Green
               0, 0, 1.5f, 0, 0,//Blue
               0, 0, 0, 1, 0 });//alpha
        bmpGrayscale = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565);

        Canvas c = new Canvas(bmpGrayscale);
        Paint paint = new Paint();

        ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
        paint.setColorFilter(f);
        c.drawBitmap(bitmap, 0, 0, paint);
        /*BitmapDrawable bmd = new BitmapDrawable(bmpGrayscale);
        photo_view.setBackgroundDrawable(bmd);*/

        photo_view.setImageBitmap(bmpGrayscale);

I usaría drawImage a blit la imagen a una lona, ??getImageData() para acceder a los píxeles, y a continuación, un bucle sobre la .data de los datos de imagen, el establecimiento de los valores RGB para cada píxel a su constante y el cuarto valor (alfa) a lo que obtuvo de la imagen. A continuación, puede capa de esta tela semi-transparente sobre lo que sea necesario.

Editar : He puesto un trabajo de este ejemplo en mi sitio web. Sólo funciona en Chrome / Safari.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top