2012-04-01 9 views
5

Quando sto usando copyPixelsFromBuffer e copyPixelsToBuffer, la bitmap non visualizza come la stessa, ho cercato qui di seguito il codice:nuova bitmap, cambio a copiare utilizzando Buffer

Bitmap bm = BitmapFactory.decodeByteArray(a, 0, a.length); 
int[] pixels = new int[bm.getWidth() * bm.getHeight()]; 
bm.getPixels(pixels, 0, bm.getWidth(), 0, 0,bm.getWidth(),bm.getHeight()); 

ByteBuffer buffer = ByteBuffer.allocate(bm.getRowBytes()*bm.getHeight()); 
bm.copyPixelsToBuffer(buffer);//I copy the pixels from Bitmap bm to the buffer 

ByteBuffer buffer1 = ByteBuffer.wrap(buffer.array()); 
newbm = Bitmap.createBitmap(160, 160,Config.RGB_565); 
newbm.copyPixelsFromBuffer(buffer1);//I read pixels from the Buffer and put the pixels  to the Bitmap newbm. 

imageview1.setImageBitmap(newbm); 
imageview2.setImageBitmap(bm); 

Perché il bm bitmap e newbm non mostravano lo stesso contenuto?

risposta

0

Nel codice, si copiano i pixel in un bitmap con il formato RGB_565, mentre la bitmap originale da cui si ottengono i pixel deve essere in un formato diverso.

Il problema risulta dalle documentation di copyPixelsFromBuffer():

I dati nel buffer non è cambiato in alcun modo (a differenza setPixels(), che converte da 32bit unpremultipled a qualsiasi formato nativo della bitmap è

Quindi utilizzare lo stesso formato bitmap oppure utilizzare setPixels() o disegnare la bitmap originale su quella nuova utilizzando una chiamata Canvas.drawBitmap().

Anche utilizzare bm.getWidth() & bm.getHeight() per specificare le dimensioni del nuovo bitmap invece di codificare come 160.

+0

BitmapFactory.Options opts = new Options(); opts.inPreferredConfig = Config.RGB_565; \t \t \t \t \t bm = BitmapFactory.decodeByteArray (a, 0, a.length, opts); La configurazione della bitmap originale è RGB565, anche se non configuro la configurazione, la configurazione è predefinita come RGB565 ... – Hexor

+0

@Hexor Gli altri metodi descritti nella mia risposta funzionano? Quanto è diverso 'newbm' rispetto a' bm'? –

+0

La dimensione non è giusta e la qualità è molto bassa. Ho trovato personalmente una soluzione che, come questo, creava una Bitmap chiamata originBm e chiamava il metodo di decodifica di BitmapFactory per inizializzare l'origineBm (assicurati solo che il parametro potesse inizializzare l'origineBm a destra), quindi uso newbm = originBm; newbm.copyPixelsFromBuffer (buffer1). Dopo questo, il newbm potrebbe visualizzare la cosa giusta. Non so quale sia la causa, ma ho pensato che magari usando copyPixelsFromBuffer() ci sia mancato qualcosa che il metodo createBitmap() non poteva darci. – Hexor

Problemi correlati