2010-11-30 6 views
1

Dans mon projet, j'ai une image bitmap. J'ai besoin de convertir cette image en byteArray afin de manipuler quelques octets et ensuite l'enregistrer en tant qu'image.Android: convertir l'image en byteArray

avec ce code image = BitmapFactory.decodeResource(context.getResources(), R.drawable.tasnim); J'ai accès à la largeur et à la hauteur mais comment puis-je accéder aux octets de cette image?

Merci

Répondre

2

Je suppose que l'OP veut manipuler les pixels, pas les informations d'en-tête de l'image ...

En supposant que votre image est un Bitmap

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

Bien sûr , cela vous donne des valeurs de pixels entières ... Mais vous pouvez toujours les convertir à nouveau.

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

Merci de st0le cool, mais j'ai une question. Je pense que dans les images bitmap, chaque pixel comprend 3 octets pour R, G et B. Alors, dois-je écrire int [w * h * 3] au lieu de int [w * h] en deuxième ligne? – Hesam

+0

oh, je pense que chaque entier comprend 4 octets, donc pas besoin de * 3. corriger? – Hesam

+0

non, voir les valeurs de pixels sont stockés entièrement dans un seul entier ... donc ARGB (chacun de 1 octet x4) est stocké comme un entier '(4 octets)' .... donc chaque entier est un pixel entier non seulement A, R, G, B ... vous aurez besoin d'opérations au niveau du bit pour les extraire/isoler. :) Je vais ajouter une édition juste au cas où, pour vous aider ... – st0le

3

AFAIK La façon la plus correcte est la suivante:

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 (size); donne OutOfMemoryException. Des idées!! –