Согласно документации Mobile Vision API, объект Frame
имеет метод getBitmap()
, но четко указано, что
getBitmap ()
Возвращает растровое изображение, которое было указано при создании этого кадра, или null, если для создания этого кадра не использовалось растровое изображение.
Если вы действительно хотите получить объект Bitmap, вам придется создать его самостоятельно. Один из вариантов - метод getGrayscaleImageData()
для объекта Frame
.
Если в возвращенном ByteBuffer
есть несколько байтов, вы можете преобразовать его в Bitmap
.
Сначала вы должны создать YuvImage
, используя массив байтов из вашего getGrayscaleImageData()
результата. Это обязательный шаг, потому что в массиве байтов есть изображение в YUV / YCbCr цветовое пространство, закодированное в NV21. Итак, первая строка будет выглядеть так:
YuvImage yuvImage = new YuvImage(frame.getGrayscaleImageData().array(), ImageFormat.NV21, width, height, null);
width
и height
можно извлечь из кадра методами getMedatada().getHeight()
/ getMedatada().getWidth()
.
Затем вы можете использовать ByteArrayOutputStream
, чтобы быстро сжать ваш YuvImage
объект.
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
yuvImage.compressToJpeg(new Rect(0, 0, width, height), 100, byteArrayOutputStream);
Оттуда вы можете снова преобразовать его в массив байтов, чтобы наконец использовать его в BitmapFactory
.
byte[] jpegArray = byteArrayOutputStream.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length);
Я знаю, что это много кода по сравнению с использованием простого getBitmap()
метода, но он выполнит свою работу, если вам действительно нужно растровое изображение в такой ситуации.
person
palucdev
schedule
23.10.2017