Я пытаюсь преобразовать изображение из YUV_420_888 в rgb, и у меня есть некоторые проблемы с выходным изображением. В ImageReader я получаю изображение в формате YUV_420_888 (используя камеру 2 api для получения этого предварительного просмотра).camera2 api конвертировать yuv420 в rgb green out
imageReader = ImageReader.newInstance(1920,1080,ImageFormat.YUV_420_888,10);
В Android SDK для написания класса YuvImage, что 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. NV21 - это то же самое, за исключением того, что U и V заменяются, то есть VUVUVUVUV вместо UVUVUVUVUV. – samgak