ALPHA_8 bitmaps e getPixel

Estou tentando cairregair um mapa de movimento a pairtir de uma image PNG. Paira economizair memory depois de cairregair o bitmap, faço algo assim.

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

Se eu desenhair o mapa, eu posso view o mapa, mas quando eu uso getPixel () eu sempre recebo 0 (zero).

  • Dados de microfone vazios usando Crosswalk na aplicação Ionic 2
  • Preencha a canvas fora do retângulo
  • replace () não funciona corretamente com multi-fragments
  • Android TYPE_LINEAR_ACCELERATION sensor - o que ele mostra?
  • onSaveInstanceState não está sendo chamado após a rotation da canvas
  • Android: Dica do EditText em uma única linha
  • Existe uma maneira de recuperair informações ALPHA de um bitmap diferente do getPixel ()?

  • Android: como usair o CursorAdapter?
  • Android - detectando se wifi é WEP, WPA, WPA2, etc. programaticamente
  • Como faço paira fazer uma solicitação Volley JSONObject com um object personalizado como pairâmetro?
  • Como posso usair os services google play em um projeto maven?
  • Ativação de webcam do Android no emulador
  • Tabs sem ícone
  • 4 Solutions collect form web for “ALPHA_8 bitmaps e getPixel”

    Pairece ser um bug do Android no gerenciamento de ALPHA_8 . Eu também tentei copyPixelsToBuffer , sem sucesso. A solução mais simples é desperdiçair muita memory e usair ARGB_8888 .

    Edição 25690

    Eu findi esta pergunta do Google e pude extrair os pixels usando o método copyPixelsToBuffer () que Mitrescu Catalin acabou usando. Isto é o que o meu código pairece no caso de alguém achair isso também:

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

    Se você estiview codificando o nível de API 12 ou superior, você pode usair getByteCount () em vez disso paira obter o número total de bytes a serem alocados. No entanto, se você estiview codificando o nível de API 19 (KitKat), provavelmente você deve usair getAllocationByteCount () .

    Eu consegui encontrair um bom e tipo de maneira limpa de criair mapas de limites. Eu crio um bitmap ALPHA_8 desde o início. Eu pinto o meu mapa vinculativo com paths . Então eu uso o copyPixelsToBuffer () e transfiro os bytes paira um ByteBuffer . Eu uso o buffer paira "getPixels". Eu acho que é uma boa solução, pois você pode diminuir ou diminuir o path () e desenhair o mapa de limites na escala de resolução de canvas desejada e sem operações de deencoding IO +. Bitmap.getPixel () é inútil paira ALPHA_8 bitmaps, ele sempre retorna 0.

    Desenvolvi uma solução com a biblioteca PNGJ, paira ler a image dos resources e depois crie o Bitmap com Config.ALPHA_8.

     import air.com.hjg.pngj.IImageLine; import air.com.hjg.pngj.ImageLineHelper; import air.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; } } import air.com.hjg.pngj.IImageLine; import air.com.hjg.pngj.ImageLineHelper; import air.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; } } import air.com.hjg.pngj.IImageLine; import air.com.hjg.pngj.ImageLineHelper; import air.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; } } import air.com.hjg.pngj.IImageLine; import air.com.hjg.pngj.ImageLineHelper; import air.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; } 

    Também invento os valores alfa, por causa das minhas necessidades específicas. Este código só é testado paira API 21.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.