2010-11-30 5 views
1

В моем проекте у меня есть растровое изображение. Мне нужно преобразовать это изображение в byteArray, чтобы манипулировать несколькими байтами, а затем сохранить его как изображение.Android: отображение изображения в byteArray

с этим кодом image = BitmapFactory.decodeResource(context.getResources(), R.drawable.tasnim); У меня есть доступ к ширине и высоте, но как я могу получить доступ к байтам этого изображения?

Благодаря

ответ

2

Я предполагаю, что ОП хочет манипулировать пикселей, а не информацию заголовка Образа ...

Предполагая, что ваш image является Bitmap

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

Конечно , это дает вам значения Pixel как целые числа ... Но вы всегда можете их преобразовать.

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

Благодаря прохладное st0le, но у меня есть вопрос. Я думаю, что в растровых изображениях каждый пиксель включает в себя 3 байта для R, G и B. Итак, я должен написать int [w * h * 3] вместо int [w * h] во второй строке? – Hesam 2010-11-30 14:32:23

+0

ой, я думаю, что каждое целое число включает 4 байта, поэтому не нужно * 3. исправить? – Hesam 2010-11-30 14:52:00

3

AFAIK Наиболее правильный путь:

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