Selon Mobile Vision documentation de l'API, l'objet Frame
a méthode getBitmap()
mais il est clairement indiqué que
GetBitmap()
Renvoie le bitmap qui a été spécifié dans la création de ce cadre, ou null si aucune bitmap a été utilisé pour créer ce cadre.
Si vous voulez vraiment obtenir un objet Bitmap, vous devrez le créer vous-même. Une des options est par la méthode getGrayscaleImageData()
sur l'objet Frame
.
S'il existe des octets dans ByteBuffer
retournés, vous pouvez le convertir en Bitmap
.
Premièrement, vous devez créer YuvImage
en utilisant le tableau de byte de votre résultat getGrayscaleImageData()
. C'est une étape obligatoire car le tableau d'octets contient une image dans l'espace colorimétrique YUV/YCbCr, codé au format NV21. Donc, première ligne ressemblera à ceci:
YuvImage yuvImage = new YuvImage(frame.getGrayscaleImageData().array(), ImageFormat.NV21, width, height, null);
width
et height
peut être extraite de la trame par getMedatada().getHeight()
/getMedatada().getWidth()
méthodes.
Ensuite, vous pouvez utiliser ByteArrayOutputStream
pour compresser rapidement votre objet YuvImage
.
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, width, height), 100, byteArrayOutputStream);
De là, vous pouvez le convertir à l'octet nouveau tableau d'utiliser finalement dans BitmapFactory
.
byte[] jpegArray = byteArrayOutputStream.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length);
Je sais qu'il est beaucoup de code de comparaison avec l'utilisation de la méthode simple, getBitmap()
, mais il fera le travail si vous avez vraiment besoin bitmap dans ce genre de situation.
Avez-vous des solutions? –