2016-11-03 5 views
0

Я использую Android Studio 2.2 и получаю byte[] data массив от onPreviewFrame() от камеры. У меня есть mutable bitmap с тем же размером, что и разрешение изображения с камеры. Я хочу переопределить пиксели растрового изображения с пикселями от int[] array, которые я получаю от преобразования массива byte[] data с YUV в формат RGB. Поэтому я делаю следующее:Android Studio Color int array to Color int matrix

public static void correctWithIntArray(Bitmap bmp,int[] data) { 
    for(int y=0;y<bmp.getHeight();y++) { 
     for(int x=0;x<bmp.getWidth();x++) { 
      bmp.setPixel(x,y,data[y*bmp.getHeight() + x]); 
     } 
    } 
} 

Но я получаю очень странный результат на выходе.

Вот образ, который я сделал с классами Android, чтобы получить изображение: Original

А вот изображение я получаю при использовании correctWithIntArray: CorrectedImage

Что я делаю неправильно в этот цикл?

Функция для создания int[] data массива в моей функции:

/** 
* Converts YUV420 NV21 to RGB8888 
* 
* @param data byte array on YUV420 NV21 format. 
* @param width pixels width 
* @param height pixels height 
* @return a RGB8888 pixels int array. Where each int is a pixels ARGB. 
*/ 
public static int[] convertYUV420_NV21toRGB8888(byte [] data, int width, int height) { 
    int size = width*height; 
    int offset = size; 
    int[] pixels = new int[size]; 
    int u, v, y1, y2, y3, y4; 

    // i percorre os Y and the final pixels 
    // k percorre os pixles U e V 
    for(int i=0, k=0; i < size; i+=2, k+=2) { 
     y1 = data[i ]&0xff; 
     y2 = data[i+1]&0xff; 
     y3 = data[width+i ]&0xff; 
     y4 = data[width+i+1]&0xff; 

     u = data[offset+k ]&0xff; 
     v = data[offset+k+1]&0xff; 
     u = u-128; 
     v = v-128; 

     pixels[i ] = convertYUVtoRGB(y1, u, v); 
     pixels[i+1] = convertYUVtoRGB(y2, u, v); 
     pixels[width+i ] = convertYUVtoRGB(y3, u, v); 
     pixels[width+i+1] = convertYUVtoRGB(y4, u, v); 

     if (i!=0 && (i+2)%width==0) 
      i+=width; 
    } 

    return pixels; 
} 

ответ

0

Я решил проблему с помощью setPixels() функции:

/** 
* @param bmp Must be mutable. 
* @param data 
*/ 
public static void correctWithByteArray(Bitmap bmp,int[] data) { 
    bmp.setPixels(data,0,bmp.getWidth(),0,0,bmp.getWidth(),bmp.getHeight()); 
} 

Так что я не нашел ответа на мой вопрос , но я решил свою проблему.