Bitmap ALPHA_8 e getPixel

Sto cercando di caricare una mappa di movimento da un'image PNG. Per salvare la memory dopo aver caricato la bitmap, faccio qualcosa di simile.

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

Se traendo il mapBmp posso vedere la mappa ma quando uso il getPixel () ottengo sempre 0 (zero).

  • Come posso intercettare un SMS in entrata con un text specifico
  • Integra l'authorization del firebase con gli endpoint dei cloud di motori di Google
  • Installare (e aggiornare) l'applicazione Android dal mio sito web e non sul mercato
  • Utilizzo di Mediaplayer all'interno di un frammento
  • Allineare il drawableLeft con il text del button
  • Come caricare un apk più volte per giocare a un negozio?
  • C'è un modo per recuperare le informazioni ALPHA da una bitmap diversa da quella di getPixel ()?

  • Come sostituire il system.out con Toasts all'interno di un thread
  • GooglePlayServicesUtil vs GoogleApiAvailability
  • Implementare il design dei materiali in android 5.0 e inferiore
  • onResume () aggiorna TextView
  • Android INSTALL_FAILED_UID_CHANGED
  • Il metodo di gioco API di YouTube IFrame non funziona prima di toccare alcune compresse Android
  • 4 Solutions collect form web for “Bitmap ALPHA_8 e getPixel”

    Sembra essere un bug Android per la gestione di ALPHA_8 . Ho anche provato copyPixelsToBuffer , senza alcun risultato. La soluzione più semplice è quella di sprecare un sacco di memory e utilizzare ARGB_8888 .

    Numero 25690

    Ho trovato questa domanda da Google e sono stato in grado di estrarre i pixel utilizzando il metodo copyPixelsToBuffer () che Mitrescu Catalin ha finito con l'utilizzo. Questo è quello che sembra il mio codice nel caso in cui qualcuno lo trovi anche:

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

    Se stai codificando il livello API 12 o superiore, puoi utilizzare invece getByteCount () per get il numero totale di byte da allocare. Tuttavia, se si sta codificando per il livello API 19 (KitKat), si dovrebbe probabilmente utilizzare getAllocationByteCount () .

    Sono riuscito a trovare una bella e sorta di modo pulito per creare mappe di border. Creo una bitmap ALPHA_8 sin dall'inizio. Vernio la mia mappa del border con i routes . Poi uso il copyPixelsToBuffer () e trasferisco i byte in un ByteBuffer . Io uso il buffer per "getPixels" da. Penso che sia una buona soluzione poiché è ansible scalare o abbassare il path () e disegnare la mappa del limite alla scala della risoluzione dello schermo desiderata e senza operazioni di decodifica di IO +. Bitmap.getPixel () è inutile per le bitmap ALPHA_8, restituisce sempre 0.

    Ho sviluppato la soluzione con la libreria PNGJ, per leggere l'image dalle risorse e quindi creare 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; } 

    Anch'io invertisco i valori alfa, a causa delle mie particolari esigenze. Questo codice è testato solo per API 21.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.