Возникла проблема с преобразованием проприетарного формата изображения камеры Android в формат JPEG, а затем кодирование его в строку.Я посмотрел на консенсусные методы для этого, но мои результаты неполные;изображения представляют собой 95% серые рамки с небольшим количеством того, что видит камера.
Метод, который я использую для преобразования JPEG, основан на том, что найдено в этой ссылке (другие ответы, кажется, дают решения, которые очень похожи)
Как только у меня есть байты JPEG, япередать это в Java Base64.encoder объект, который имеет метод encodeToString.Я попытался обойти это, просто сделав снимок экрана с приложением, но на полученном изображении сеанс AR был выделен серым цветом.
Используемое мной изображение получено из метода ARCore acquCameraImage, который возвращает изображение в формате YUV_420_888.
Снимок экрана, показывающий частичную загрузку изображения
fun encode(image: Image) {
val bytes = convertToJPEG(image)
image.close()
val encoder = Base64.getEncoder()
val str = encoder.encodeToString(bytes)
println("ENCODED!: " + str)
}
fun convertToJPEG(image: Image): ByteArray {
val yBuffer = image.planes[0].buffer
val uBuffer = image.planes[1].buffer
val vBuffer = image.planes[2].buffer
val ySize = yBuffer.remaining()
val uSize = uBuffer.remaining()
val vSize = vBuffer.remaining()
val bytes = ByteArray(ySize + uSize + vSize)
yBuffer.get(bytes, 0, ySize)
vBuffer.get(bytes, ySize, vSize)
uBuffer.get(bytes, ySize + vSize, uSize)
// jpeg below
val stream = ByteArrayOutputStream()
val yuv = YuvImage(bytes, ImageFormat.NV21, image.width, image.height, null)
yuv.compressToJpeg(Rect(0, 0, image.width, image.height), 80, stream)
return stream.toByteArray()
}