2012-02-12 12 views
7

Estoy intentando cargar un mapa de movimiento desde una imagen PNG. Para guardar la memoria después de cargar el mapa de bits, hago algo así.ALPHA_8 bitmaps y getPixel


`Bitmap mapBmp = tempBmp.copy(Bitmap.Config.ALPHA_8, false);` 

Si dibujo del mapBmp puedo ver el mapa, pero cuando uso getPixel() Puedo obtener siempre 0 (cero).

¿Hay alguna manera de recuperar información ALPHA de un mapa de bits que no sea con getPixel()?

Respuesta

0

que fue capaz de encontrar una manera agradable y una especie de limpia para crear mapas de límites. Creé un mapa de bits ALPHA_8 desde el principio. I pinto mi mapa de delimitación con las rutas. Luego uso el copyPixelsToBuffer() y transfiero los bytes a ByteBuffer. Yo uso el buffer para "getPixels" de. Creo que es una buena solución ya que puede escalar hacia abajo o hacia arriba en la ruta() y dibujar el mapa de límites en la escala de resolución de pantalla deseada y sin operaciones de decodificación IO +. Bitmap.getPixel() es inútil para los mapas de bits ALPHA_8, siempre devuelve 0.

+0

¿Podría proporcionar un ejemplo de cómo puedo extraer los "píxeles" de un 'ALPHA_8'' Bitmap'? Siempre estoy recibiendo 0 ... –

4

Parece ser un error de Android en el manejo de ALPHA_8. También probé copyPixelsToBuffer, fue en vano. La solución más simple es perder mucha memoria y usar ARGB_8888.

Issue 25690

1

me encontré con esta pregunta de Google y yo era capaz de extraer los píxeles utilizando el método copyPixelsToBuffer() que Mitrescu Catalin terminó usando. Esto es lo que mi código es similar en el caso de cualquier otra persona encuentra esto así:

public byte[] getPixels(Bitmap b) { 
    int bytes = b.getRowBytes() * b.getHeight(); 
    ByteBuffer buffer = ByteBuffer.allocate(bytes); 
    b.copyPixelsToBuffer(buffer); 
    return buffer.array(); 
} 

Si está codificando para el nivel de API 12 o superior se puede utilizar en lugar getByteCount() para obtener el número total de bytes a reservar. Sin embargo, si está codificando para API nivel 19 (KitKat) probablemente debería usar getAllocationByteCount() en su lugar.

0

Desarrollé la solución con la biblioteca PNGJ, para leer la imagen de los activos y luego crear Bitmap con Config.ALPHA_8.

import ar.com.hjg.pngj.IImageLine; 
import ar.com.hjg.pngj.ImageLineHelper; 
import ar.com.hjg.pngj.PngReader; 

public Bitmap getAlpha8BitmapFromAssets(String file) { 

    Bitmap result = null; 

    try { 

     PngReader pngr = new PngReader(getAssets().open(file)); 
     int channels = pngr.imgInfo.channels; 
     if (channels < 3 || pngr.imgInfo.bitDepth != 8) 
      throw new RuntimeException("This method is for RGB8/RGBA8 images"); 

     int bytes = pngr.imgInfo.cols * pngr.imgInfo.rows; 
     ByteBuffer buffer = ByteBuffer.allocate(bytes); 

     for (int row = 0; row < pngr.imgInfo.rows; row++) { 

      IImageLine l1 = pngr.readRow(); 

      for (int j = 0; j < pngr.imgInfo.cols; j++) { 

       int original_color = ImageLineHelper.getPixelARGB8(l1, j); 

       byte x = (byte) Color.alpha(original_color); 

       buffer.put(row * pngr.imgInfo.cols + j, x ^= 0xff); 

      } 

     } 

     pngr.end(); 

     result = Bitmap.createBitmap(pngr.imgInfo.cols,pngr.imgInfo.rows, Bitmap.Config.ALPHA_8); 
     result.copyPixelsFromBuffer(buffer); 

    } catch (IOException e) { 
     Log.e(LOG_TAG, e.getMessage()); 
    } 

    return result; 

} 

También invierto valores alfa, debido a mis necesidades particulares. Este código solo se ha probado para API 21.

Cuestiones relacionadas