2017-12-01 2 views
1

更新:デバイスのベンダーに連絡して、平面4:2:0のYUVフルを使用していることを知らせました大規模なピクセル形式です。研究の結果、YUV 4:2:0:I420、J420、YV12の3つの主要フォーマットがあるように見えました。 私のコードを実行しているときに、このイメージ形式の定数は、アンドロイドYuvImageクラスであったので、私はしかし、私は次の例外だ興奮していた。その私の後..まあ残念厥YUVフルスケールピクセルフォーマット

java.lang.IllegalArgumentException: only support ImageFormat.NV21 and ImageFormat.YUY2 for now 

YUV420YUV420_NV21

IはNV21のピクセルフォーマットの画像に示すような2色プレーンをインターリーブするためにいくつかの簡単な関数を書くことを試みた:YUV420とNV21の違いについて学びました。

public static void convertYUY420ToNV21(byte[] data_yuv420, byte[] data_yuv_N21) { 
    int idx = (int) (data_yuv_N21.length * (2.0f/3.0f)); 
    int j = idx; 
    int chroma_plane_end = (int) (idx + ((data_yuv_N21.length - idx)/2)); 

    for (int i = idx; i < chroma_plane_end; i++) { 
     data_yuv_N21[j] = data_yuv420[i]; 
     j += 2; 
    } 
    j = idx + 1; 
    for (int i = chroma_plane_end; i < data_yuv_N21.length; i++) { 
     data_yuv_N21[j] = data_yuv420[i]; 
     j += 2; 
    } 

しかし、結果は私が考えていた 一つの可能​​な理由は、バイト配列(1843200)の大きさだった...まだ私の元のコードと同じようです。 YUV420の場合、1ピクセルの深度は12ビットです。カメラの解像度は1280x720で、921,600ピクセルまたは1,382,400バイトです。これは、実際のバイト配列サイズの1/3です。私は飛行機の間にいくつかのパディングがあるかもしれないと読んだが、私はそれについて調べる方法に固執している。

YuvImageクラスには、そのコンストラクタにstridesパラメータがありますが、アンドロイドデベロッパーのドキュメントを読んだ後でも、どのように使用するかはわかりません。

手がかりはありますか?

オリジナルポスト:

私は次のような問題を抱えている:私は使用されているカメラや画像フォーマットの種類に提供する情報がないデバイスのカメラにアクセスしようとしています。提供される唯一の情報は、ビデオストリーム出力を含むバイト配列を取り出す方法です。 しかし、解像度は1280x720で、バイト配列のサイズは1843200です。私はグーグルでYUYVなどのピクセル形式を使って正確に同じサイズとサイズのカメラを見つけました。

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      YuvImage yuv = new YuvImage(data, ImageFormat.YUY2, 1280, 720, null); 
      yuv.compressToJpeg(new Rect(0, 0, 1280, 720), 100, out); 
      byte[] bytes = out.toByteArray(); 
      bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
      if (bitmap != null) { 
       ImageView cameraImageView = (ImageView) findViewById(R.id.imageView); 
       cameraImageView.setImageBitmap(bitmap); 
      } 

をカラーチャンネルに関連する何かおそらく、BitmapFactory.decodeByteArray機能が有効なビットマップを返されたが、それを表示するとき、私は画像が緑の色合いや紫の斑点を持つ見た:私は以下のコードを書いたその知識に基づいて ? サンプル画像: Image with green tint/ purple spots

使用されている正確なピクセル形式/エンコーディングを見つける方法はありますか?私は他のものをここから試してみるべきか分からない。 アドバイスありがとうございます、ありがとう!

+0

最も一般的なYUV422カメラフォーマットはUYVYです。 –

+1

http://rawpixels.netで始まり、カメラから取得したバッファの実際のフォーマットを確認してください。 –

+1

あなたのリンクが私を助けました!彼らは私に間違った情報を与えました。実際にはRGB565形式のRGBA形式でした。あなたは私の問題を解決しましたが、私は受け入れられた回答としてコメントをタグ付けできないと思いますか?=/ – Unfixable

答えて

0

はこれを試してみてください。

/** 
    * Save YUV image data (NV21 or YUV420sp) as JPEG to a FileOutputStream. 
    */ 
    public static boolean saveYUYToJPEG(byte[] imageData,File saveTo,int format,int quality,int width,int height,int rotation,boolean flipHorizontally){ 
     FileOutputStream fileOutputStream=null; 
     YuvImage yuvImg=null; 
     try { 
     fileOutputStream=new FileOutputStream(saveTo); 
     yuvImg=new YuvImage(imageData,format,width,height,null); 
     ByteArrayOutputStream jpegOutput=new ByteArrayOutputStream(imageData.length); 
     yuvImg.compressToJpeg(new Rect(0,0,width - 1,height - 1),90,jpegOutput); 
     Bitmap yuvBitmap=BitmapFactory.decodeByteArray(jpegOutput.toByteArray(),0,jpegOutput.size()); 
     Matrix imageMatrix=new Matrix(); 
     if (rotation != 0) { 
      imageMatrix.postRotate(rotation); 
     } 
     if (flipHorizontally) { 
     } 
     yuvBitmap=Bitmap.createBitmap(yuvBitmap,0,0,yuvBitmap.getWidth(),yuvBitmap.getHeight(),imageMatrix,true); 
     yuvBitmap.compress(CompressFormat.JPEG,quality,fileOutputStream); 
     } 
    catch ( FileNotFoundException e) { 
     return false; 
     } 
     return true; 
    } 
+0

残念ながら私は自分のコードと同じ結果を得ています – Unfixable

+0

https://www.programcreek.com/java-api-examples/index.php?api=android.graphics.YuvImageこれはあなたを助けるかもしれません –

関連する問題