Возможно, что-то не так с mFrame.acquireCameraImage ()?
Нет, mFrame.acquireCameraImage()
работает как задумано.
Но оно всегда равно нулю
Растровое изображение всегда будет равно нулю, поскольку фабрика растровых изображений не понимает данные изображения, которые передаются ей.
Метод mFrame.acquireCameraImage()
отвечает объектом типа Image
в формате YUV или YCbCr. Эти типы изображений имеют 3 плоскости, что очень хорошо объясняется здесь здесь . ByteArray
, содержащийся в этих плоскостях, может быть прочитан непосредственно CPU / GPU в коде native
. BitmapFactory
не может прочитать данные этого типа. Следовательно, вам нужно преобразовать это изображение YUV во что-то другое.
Для этого вам нужно использовать класс YuvImage
, чтобы создать экземпляр YUV, а затем преобразовать его в JPEG, используя метод compressToJpeg
. Получив byteArray, вы можете просто сделать то, что делаете выше. Используйте BitmapFactory
, чтобы преобразовать его в растровое изображение и добавить его в ImageView
.
Примечание: у YUV есть 3 самолета. Создайте один байтовый массив из всех плоскостей, а затем передайте его конструктору YUV. Хотя и не сложный, он должен выглядеть примерно так:
//The camera image received is in YUV YCbCr Format. Get buffers for each of the planes and use them to create a new bytearray defined by the size of all three buffers combined
val cameraPlaneY = cameraImage.planes[0].buffer
val cameraPlaneU = cameraImage.planes[1].buffer
val cameraPlaneV = cameraImage.planes[2].buffer
//Use the buffers to create a new byteArray that
val compositeByteArray = ByteArray(cameraPlaneY.capacity() + cameraPlaneU.capacity() + cameraPlaneV.capacity())
cameraPlaneY.get(compositeByteArray, 0, cameraPlaneY.capacity())
cameraPlaneU.get(compositeByteArray, cameraPlaneY.capacity(), cameraPlaneU.capacity())
cameraPlaneV.get(compositeByteArray, cameraPlaneY.capacity() + cameraPlaneU.capacity(), cameraPlaneV.capacity())
val baOutputStream = ByteArrayOutputStream()
val yuvImage: YuvImage = YuvImage(compositeByteArray, ImageFormat.NV21, cameraImage.width, cameraImage.height, null)
yuvImage.compressToJpeg(Rect(0, 0, cameraImage.width, cameraImage.height), 75, baOutputStream)
val byteForBitmap = baOutputStream.toByteArray()
val bitmap = BitmapFactory.decodeByteArray(byteForBitmap, 0, byteForBitmap.size)
imageView.setImageBitmap(bitmap)
Это просто грубый код. Возможно, у него есть возможности для улучшения. Также см. здесь .