我試圖將圖像從YUV_420_888轉換爲rgb,並且在輸出圖像時遇到了一些麻煩。在ImageReader中,我以YUV_420_888格式(使用相機2 api獲取此圖像預覽)獲取圖像。camera2 api將yuv420轉換爲rgb綠色
imageReader = ImageReader.newInstance(1920,1080,ImageFormat.YUV_420_888,10);
在爲YuvImage類寫作Android SDK中,該YuvImage只使用NV21,YUY2。
我們可以看到差異N21和YUV420之間並不大,我嘗試數據轉換爲N21
在onImageAvailable我分別得到每架飛機,並把它們放在正確的地方(如圖)
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ByteBuffer bufferY = image.getPlanes()[0].getBuffer();
byte[] data0 = new byte[bufferY.remaining()];
bufferY.get(data0);
ByteBuffer bufferU = image.getPlanes()[1].getBuffer();
byte[] data1 = new byte[bufferU.remaining()];
bufferU.get(data1);
ByteBuffer bufferV = image.getPlanes()[2].getBuffer();
byte[] data2 = new byte[bufferV.remaining()];
bufferV.get(data2);
...
outputStream.write(data0);
for (int i=0;i<bufferV.remaining();i++) {
outputStream.write(data1[i]);
outputStream.write(data2[i]);
}
後創建YuvImage,轉換爲位圖,查看和保存
final YuvImage yuvImage = new YuvImage(outputStream.toByteArray(), ImageFormat.NV21, 1920,1080, null);
ByteArrayOutputStream outBitmap = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0,1920, 1080), 95, outBitmap);
byte[] imageBytes = outBitmap.toByteArray();
final Bitmap imageBitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
mImageView.setImageBitmap(imageBitmap);
...
imageBitmap.compress(Bitmap.CompressFormat.JPEG, 95, out);
我錯過了什麼?
小點:爲NV21圖其實是錯誤的,並描述了NV12編碼。除了交換U和V之外,NV21是相同的,即VUVUVUVUV而不是UVUVUVUVUV。 – samgak