2017-02-14 3 views
0

У меня преуспел от onPreviewFrame (байт [] данные, камера камеры) {...} Будет ли NV21 извлечь Y для значения серого, но я хочу напечатать серое значение, серое значение должно быть 0 ~ 255 Но в соответствии с черной областью должно быть 0, но напечатано -16777216, как я могу видеть 0 ~ 255 PS.I знаю, что ARGB_8888 составляет 32 бита, поэтому для извлечения черной области, если 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000Android NV21 до полутоновой печати

public Bitmap applyGrayScale(byte [] data, int width, int height) { 
    int[] pixels = new int[width * height]; 
    int p; 
    int size = width*height; 

    for(int i = 0; i < size; i++) { 
     p = data[i] & 0xFF; 
     pixels[i] = 0xff000000 | p<<16 | p<<8 | p; 
     Log.d("pixels=", String.valueOf(pixels[i])); 
    } 
    return Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_8888); 
} 

enter image description here

ответ

1

Я полагаю, все, что вам нужно сделать, это печать p вместо pixels[i].

Loop Пример:

for(int i = 0; i < size; i++) { 
    p = data[i] & 0xFF; 
    Log.d("pixels=", String.valueOf(p));  
} 

-16777216 печатается в формате ARGB_8888.
-16777216 является two's complement Представление 0xFF000000.
Высший байт, равный 0xFF - это альфа-канал (непрозрачный пиксель - без прозрачности).
Все три цветовых канала - это нули.

Альфа-канал является причиной того, что черный не0000 0000 0000 0000 0000 0000 0000 0000 0000 0000.
в ARGB_8888 формат, непрозрачный черный: 11111111 00000000 00000000 00000000.

Для серых пикселей три цветовых канала имеют одинаковое значение: R = G = В.
Ваш код: pixels[i] = 0xff000000 | p<<16 | p<<8 | p; дублирует значение p к R, G и B, и установить альфа-канал для 0xFF (255 в десятичной системе).
См. ARGB формат для деталей.

Таким образом, вы можете просто напечатать значение p.

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