Как сгенерировать RGB-изображение в python из массива байтов? - PullRequest
0 голосов
/ 10 октября 2019

Я делаю приложение клиент / сервер. Клиент - это устройство Android, а сервер - мой компьютер, на котором работает python. На устройстве Android я сделал предварительный просмотр камеры, а затем преобразовал ее в массив байтов следующим образом (используя cameraX с вариантом использования анализа):

override fun analyze(image: ImageProxy?, rotationDegrees: Int) {

    val buffer = image?.planes?.get(0)?.buffer
    // Extract image data from callback object
    val data = buffer?.toByteArray()
    // Convert the data into an array of pixel values
    // I commented this line, but I can use pixel value if you think is better
    //val pixels = data?.map { it.toInt() and 0xFF }
    Sender(mContext, mBufferedOutputStrem, mBufferedReader).execute(data)

}
private fun ByteBuffer.toByteArray(): ByteArray {
    rewind()    // Rewind the buffer to zero
    val data = ByteArray(remaining())
    get(data)   // Copy the buffer into a byte array
    return data // Return the byte array
}

Затем, с моим классом Sender,Я отправляю на мой сервер массив байтов, содержащий изображение.

override fun doInBackground(vararg p0: ByteArray): String {
    return try {

        mBufferedOutputStream.write(p0[0])
        mBufferedOutputStream.flush()
        ..........

На моем сервере python я читаю буфер с такой строкой:

buf = conn.recv(4096)

Итак, buf - это массивбайта. Как я могу преобразовать это в изображение и сохранить его на диск? Я также хотел бы сначала отобразить изображение с помощью openCv. Как мне этого добиться? пс. Вместо conn.recv (4096), я должен передать другое значение вместо 4096? Если размер изображения составляет менее 4096 байт, могу ли я столкнуться с какой-либо проблемой?

1 Ответ

0 голосов
/ 11 октября 2019

Код решения:

val buffer = ByteBuffer.allocate(1280 * 720 * 2)
        val yBuffer = image?.planes?.get(0)?.buffer // Y
        val uBuffer = image?.planes?.get(1)?.buffer // U
        val vBuffer = image?.planes?.get(2)?.buffer // V

        buffer.put(yBuffer!!)
        buffer.put(vBuffer!!)
        buffer.put(uBuffer!!)

        val data = buffer.toByteArray()

        val yuvImage = YuvImage(
            buffer.array(),
            ImageFormat.NV21, image.width, image.height, null
        )

        val out = ByteArrayOutputStream()
        yuvImage.compressToJpeg(
            Rect(
                0, 0,
                image.width, image.height
            ), 50, out
        )
        val imageBytes = out.toByteArray()
        val bm = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size)
        Sender(mContext, mBufferedOutputStrem, mBufferedReader).execute(imageBytes)
    }

}
private fun ByteBuffer.toByteArray(): ByteArray {
    rewind()    // Rewind the buffer to zero
    val data = ByteArray(remaining())
    get(data)   // Copy the buffer into a byte array
    return data // Return the byte array
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...