2016-11-03 16 views
0

私はAndroidスタジオ2.2を使用しており、byte[] dataアレイをカメラからonPreviewFrame()に取得しています。カメラからの画像の解像度と同じサイズのビットマップを可変可能にしました。ビットマップのピクセルを、byte[] dataの配列をYUVからRGBの形式に変換することによって得られるint[] arrayのピクセルで上書きしたいとします。だから、私は次のようにします:Androidスタジオカラーint配列からカラーintマトリックス

しかし、私は出力に非常に奇妙な結果を得ます。 Original

そしてここcorrectWithIntArrayを使用しているとき私が得る画像は、次のとおりです:ここで

は、私がイメージを取得するには、Androidのクラスで作られたイメージはある 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()); 
} 

だから私は私の質問への答えを見つけることができますしかし、私は私の問題を解決しました。