Проблемы с преобразованием проприетарного формата изображения камеры в формат JPEG, а затем кодирование его в строку - PullRequest
0 голосов
/ 30 декабря 2018

Возникла проблема с преобразованием проприетарного формата изображения камеры 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()
}
...