2010-11-30 11 views
1

In meinem Projekt habe ich ein Bitmap-Bild. Ich muss dieses Bild in ByteArray umwandeln, um einige Bytes zu manipulieren und danach als Bild zu speichern.Android: conerting Bild in byteArray

mit diesem Code image = BitmapFactory.decodeResource(context.getResources(), R.drawable.tasnim); Ich habe Zugriff auf Breite und Höhe, aber wie kann ich Zugriff auf Bytes dieses Bildes haben?

Dank

Antwort

2

Ich gehe davon aus dem OP will die Pixel manipulieren, nicht die Header-Informationen des Bildes ...

Angenommen, Ihre image ein Bitmap

int w = image.getWidth(), h = image.getHeight(); 
int[] rgbStream = new int[w * h]; 
image.getPixels(rgbStream, 0, w, 0, 0, w, h); 

Natürlich ist , das bringt dir Pixelwerte als Ganzzahlen ... Aber du kannst sie immer wieder konvertieren.

int t = w * h; 

    for (int i = 0; i < t; i++) { 
     pixel = rgbStream[i]; //get pixel value (ARGB) 
     int A = (pixel >> 24) & 0xFF; //Isolate Alpha value... 
     int R = (pixel >> 16) & 0xFF; //Isolate Red Channel value... 
     int G = (pixel >> 8) & 0xFF; //Isolate Green Channel value... 
     int B = pixel & 0xFF; //Isolate Blue Channel value... 
         //NOTE, A,R,G,B can be cast as bytes... 


    } 
+0

Dank kühlen st0le, aber ich habe eine Frage. Ich denke, in Bitmap-Bildern enthält jeder Pixel 3 Bytes für R, G und B. Also, soll ich int [w * h * 3] anstelle von int [w * h] in der zweiten Zeile schreiben? – Hesam

+0

oh, ich denke, jede ganze Zahl enthält 4 Bytes, also muss nicht * 3. korrigieren? – Hesam

+0

nein, siehe die Pixelwerte sind vollständig in einer einzigen ganzen Zahl gespeichert ... so ARGB (jeweils 1 Byte x4) wird als Integer "(4 Byte)" gespeichert .... so ist jede ganze Zahl nicht nur ein ganzes Pixel A, R, G, B ... Sie benötigen bitweise Operationen, um sie zu extrahieren/isolieren. :) Ich werde eine Bearbeitung nur für den Fall hinzufügen, um Ihnen zu helfen ... – st0le

3

AFAIK meisten richtige Weg ist:

ByteBuffer copyToBuffer(Bitmap bitmap){ 
    int size = bitmap.getHeight() * bitmap.getRowBytes(); 
    ByteBuffer buffer = ByteBuffer.allocateDirect(size); 
    bitmap.copyPixelsToBuffer(buffer); 
    return buffer; 
} 
+0

ByteBuffer buffer = ByteBuffer.allocateDirect (Größe); gibt OutOfMemoryException. Irgendwelche Ideen!! –