ich versuche, Bild von YUV_420_888 zu rgb zu konvertieren, und ich habe einige Probleme mit dem Ausgabebild. In ImageReader erhalte ich ein Bild im Format YUV_420_888 (mit Kamera 2 api für diese Bildvorschau).camera2 api konvertieren yuv420 zu rgb grün
imageReader = ImageReader.newInstance(1920,1080,ImageFormat.YUV_420_888,10);
In android sdk für YuvImage Klasse schriftlich, dass YuvImage nur NV21, YUY2 verwenden.
wie wir Differenz zwischen N21 und YUV420 nicht groß sehen, und ich versuchen, Daten zu N21 konvertieren
in onImageAvailable ich bekomme separat alle Planes und lege sie an die richtige Stelle (wie auf dem Bild)
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]);
}
nach YuvImage Erstellen, Konvertieren zu Bitmap, anzeigen und speichern
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);
aber mein gespeicherte Bild ist grün und rosa:
was habe ich verpasst ??
Minor Punkt: das Diagramm für NV21 tatsächlich falsch ist, und zeigt NV12-Codierung. NV21 ist dasselbe, außer dass U und V vertauscht sind, d. H. VUVUVUVUV anstelle von UVUVUVUVUV. – samgak