2013-08-06 5 views
2

я получаю данные пикселя моего ARGB_8888 растрового изображения, делая это:Android- конвертировать ARGB_8888 растровое изображение 3BYTE_BGR

public void getImagePixels(byte[] pixels, Bitmap image) { 
    // calculate how many bytes our image consists of 
    int bytes = image.getByteCount(); 

    ByteBuffer buffer = ByteBuffer.allocate(bytes); // Create a new buffer 
    image.copyPixelsToBuffer(buffer); // Move the byte data to the buffer 

    pixels = buffer.array(); // Get the underlying array containing the data. 
} 

Но я хотел бы, чтобы преобразовать эти данные, в которых каждый пиксель хранится на четырех байт (ARGB), где каждый пиксель хранится на 3 байта (BGR).
Любая помощь приветствуется!

+0

Я не думаю, что 'пикселей = buffer.array()' делает то, что вы ожидаете его , Вы хотите вернуть массив пикселей или скопировать их в заранее выделенный пиксельный массив? – haraldK

+0

«пикселей» является заранее выделенным пиксельным массивом –

ответ

3

Отказ от ответственности: Это может быть лучше/проще/быстрее, используя Android Bitmap API, но я не знаком с ним. Если вы хотите идти вниз направление вы начали, вот ваш код изменен, чтобы преобразовать 4 байт ARGB 3 байта BGR

public byte[] getImagePixels(Bitmap image) { 
    // calculate how many bytes our image consists of 
    int bytes = image.getByteCount(); 

    ByteBuffer buffer = ByteBuffer.allocate(bytes); // Create a new buffer 
    image.copyPixelsToBuffer(buffer); // Move the byte data to the buffer 

    byte[] temp = buffer.array(); // Get the underlying array containing the data. 

    byte[] pixels = new byte[(temp.length/4) * 3]; // Allocate for 3 byte BGR 

    // Copy pixels into place 
    for (int i = 0; i < (temp.length/4); i++) { 
     pixels[i * 3] = temp[i * 4 + 3];  // B 
     pixels[i * 3 + 1] = temp[i * 4 + 2]; // G 
     pixels[i * 3 + 2] = temp[i * 4 + 1]; // R 

     // Alpha is discarded 
    } 

    return pixels; 
} 
+0

Это шов, чтобы исправить этот ответ, но в моем случае я конвертирую JPEG в ARGB_8888 с BitmapFactory.decodeByteArray, а затем я конвертирую этот ARGB в RGB, делая следующее: пикселей [ i * 3] = temp [i * 4 + 2]; // B пикселей [i * 3 + 1] = temp [i * 4 + 1]; // G пикселей [i * 3 + 2] = temp [i * 4 + 0]; // R Вычитание одной позиции для каждого канала. – Flayn

+0

@Flayn Звук, как и ваши данные, имеет порядок RGBA, а не ARGB. Странно. – haraldK

0

Вы можете попробовать свои силы с помощью мощной библиотеки под названием OpenCV - и она бесплатна. Он позволяет вам переключаться с BGR на RGB и наоборот. Он также позволяет вам добавлять или удалять альфа-канал («A»).

OpenCV имеет специальную версию Android для загрузки here (OpenCV for Android v 2.4.6).

В этой библиотеке, проверить cvtColor() от this documentation, в котором говорится следующее:

Функция может выполнить следующие преобразования: преобразования внутри RGB пространства, такие как добавление/удаление альфа-канал, реверсирование порядок каналов, преобразование в/из 16-битного RGB цвета (R5: G6: B5 или R 5: G5: B5), а также преобразование в/из градации серого [... и т.д.]

у меня есть приложение в магазине Google Play (UnCanny), которое использует OpenCV для Android , Потребовалось некоторое время, чтобы ускориться, но имеет множество функций.

Смежные вопросы