2012-06-17 4 views
2

in on previewframe Я получаю байт [] в ImageFormat.RGB_565. Теперь я хотел бы преобразовать этот байт [] в int [], чтобы я мог выполнять некоторые манипуляции с пикселями.onpreviewframe byte [] to int []

Как я мог это сделать?

пс. до сих пор я делаю это так, но это кажется очень неоптимизированным:

public void onPreviewFrame(byte[] data, Camera camera) { ... 
    ByteBuffer bf = ByteBuffer.wrap(data); 

     mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.RGB_565); 
     mBitmap.copyPixelsFromBuffer(bf); 

, а затем я делаю это действительно получает пикселы в междах []:

 int bitmapArray[] = new int[originalWidth * originalHeight]; 

    mBitmap.getPixels(bitmapArray, 0, originalWidth, 0, 0, 
      originalWidth, originalHeight); 
} 
+0

Это кажется разумным. Вы можете попробовать преобразовать его вручную по пикселям, но это может быть не быстрее. –

ответ

1

Я думаю, что код, чтобы сделать это вручную, должен выглядеть примерно так:

for (int i = 0; i < data.length; i += 2) { 
    // Reconstruct 16 bit rgb565 value from two bytes 
    int rgb565 = (data[i] & 255) | ((data[i + 1] & 255) << 8); 

    // Extract raw component values (range 0..31 for g and b, 0..63 for g) 
    int b5 = rgb565 & 0x1f; 
    int g6 = (rgb565 >> 5) & 0x3f; 
    int r5 = (rgb565 >> 11) & 0x1f; 

    // Scale components up to 8 bit: 
    // Shift left and fill empty bits at the end with the highest bits, 
    // so 00000 is extended to 000000000 but 11111 is extended to 11111111 
    int b = (b5 << 3) | (b5 >> 2); 
    int g = (g6 << 2) | (g6 >> 4); 
    int r = (r5 << 3) | (r5 >> 2); 

    // The rgb888 value, store in an array or buffer... 
    int rgb = (r << 16) | (g << 8) | b; 
} 

Так что, может быть действительно быстрее с промежуточной битовой карты, если вы не нужны цветовые компоненты по отдельности позже в любом случае.

Отказ от ответственности: Я не проверял это. Некоторые промежуточные переменные можно было бы избежать, но я хотел сохранить это более или менее читаемым.

+0

интересно, что его метод намного медленнее. Возможно, сделать это в NDK поможет ... Пытается попробовать – tomi

+0

Насколько медленнее? Вы взяли тайминги? Может быть интересным для других ... –

+0

NDK будет намного быстрее, если вы попытаетесь выполнить обработку изображений в android. Попробуйте пройти [этот учебник] (http://imrannazar.com/Augmented-Reality-with-the-Android-NDK:-Part-1). Это действительно помогло мне с проектом. – eternalmatt