Laut Mobile Vision-API-Dokumentation, hat Frame
Objektmethode getBitmap()
aber es ist klar gesagt, dass
GetBitmap()
die Bitmap Kosten, die bei der Erstellung dieses Rahmens angegeben wurde, oder null, wenn keine Bitmap verwendet wurde um diesen Rahmen zu erstellen.
Wenn Sie ein Bitmap-Objekt wirklich erhalten möchten, müssen Sie es selbst erstellen. Eine Option ist getGrayscaleImageData()
Methode auf Frame
Objekt.
Wenn einige zurückgegebene Bytes ByteBuffer
zurückgegeben werden, können Sie sie in Bitmap
konvertieren.
Zuerst müssen Sie YuvImage
mit Byte-Array von Ihrem getGrayscaleImageData()
Ergebnis erstellen. Dies ist ein obligatorischer Schritt, da das Byte-Array ein Bild in YUV/YCbCr Farbraum hat, das in NV21 codiert ist. Also erste Zeile wird wie folgt aussehen:
YuvImage yuvImage = new YuvImage(frame.getGrayscaleImageData().array(), ImageFormat.NV21, width, height, null);
width
und height
können durch getMedatada().getHeight()
/getMedatada().getWidth()
Methoden aus dem Rahmen extrahiert werden.
Dann können Sie ByteArrayOutputStream
verwenden, um schnell Ihr YuvImage
Objekt zu komprimieren.
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, width, height), 100, byteArrayOutputStream);
Von dort können Sie wandeln es wieder auf Byte-Array, um es schließlich in BitmapFactory
zu verwenden.
byte[] jpegArray = byteArrayOutputStream.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length);
Ich weiß, dass es eine Menge Code ist auf einfache getBitmap()
Methode Nutzung zu vergleichen, aber es wird die Arbeit tun, wenn Sie wirklich Bitmap in einer solchen Situation brauchen.
Haben Sie irgendwelche Lösungen? –