Конвертировать RGBA в ARGB_8888 в Android
Я получаю массив байтов из NDK в формате RGBA. Мне нужно сбросить массив байтов в растровое изображение (чтобы показать в ImageView или Surface).
Я хотел бы использовать:
Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bm.copyPixelsFromBuffer(ByteBuffer.wrap(buffer));
Но не могу найти способ конвертировать RGBA в формат ARGB_8888.
Есть идеи?
Спасибо!
2 ответа
(Oldie но...) Вы можете поменять местами порядок байтов также с Java-кодом. Пример доступа к растровым байтам, которые я написал здесь, может быть полезен...
Из-за общественного спроса (следующее не проверено - я все еще посмотрю, что скрывается за этой загадочной ссылкой) IE Follow не проверено:
public static Bitmap RGBA2ARGB(Bitmap img)
{
int width = img.getWidth();
int height = img.getHeight();
int[] pixelsIn = new int[height*width];
int[] pixelsOut = new int[height*width];
img.getPixels(pixelsIn,0,width,0,0,width,height);
int pixel=0;
int count=width*height;
while(count-->0){
int inVal = pixelsIn[pixel];
//Get and set the pixel channel values from/to int //TODO OPTIMIZE!
int r = (int)( (inVal & 0xff000000)>>24 );
int g = (int)( (inVal & 0x00ff0000)>>16 );
int b = (int)( (inVal & 0x0000ff00)>>8 );
int a = (int)( inVal & 0x000000ff) ;
pixelsOut[pixel] = (int)( a <<24 | r << 16 | g << 8 | b );
pixel++;
}
Bitmap out = Bitmap.createBitmap(pixelsOut,0,width,width,height, Bitmap.Config.ARGB_8888);
return out;
}
Вы можете использовать OpenCV (вы можете использовать его с NDK). затем используйте этот метод: cvCvtColor(sourceIplimage, destinationIplImage, code)