将位图转换为字节数组以显示在电子纸上

问题描述 投票:0回答:1

所以我必须将 400x300 的位图转换为大小恰好为 15000 的字节数组。它必须显示在电子纸屏幕上,因此只能是黑/白/灰。

这是我迄今为止的尝试:

fun convertPictureToByteArray(bitmap: Bitmap): ByteArray {
        val byteArray = ByteArray(15000)
        var index = 0
        var temp = 0

        val pixels = IntArray(bitmap.width * bitmap.height)
        bitmap.getPixels(pixels, 0, bitmap.width, 0, 0, bitmap.width, bitmap.height)
        for(x in (bitmap.height - 1) downTo 0) {
            for(y in 0 until bitmap.width / 8) {
                var tempPixels = IntArray(8)
                for(z in 0 until 8) {
                    tempPixels[z] = pixels[temp]
                    temp++
                }
                var totalLuminance = 0.0
                for(pixel in tempPixels) {
                    val red = Color.red(pixel)
                    val green = Color.green(pixel)
                    val blue = Color.blue(pixel)

                    val luminance = 0.299 * red + 0.587 * green + 0.114 * blue
                    totalLuminance += luminance
                }

                val averageLuminance = totalLuminance / tempPixels.size
                byteArray[index] = grayShadesArray[averageLuminance.toInt()]
                index++
            }
        }

        return byteArray
    }

基本上,它应该做的是逐个像素地遍历位图,并从彼此相邻的 8 个像素中获取平均亮度。根据平均亮度,我从 greyShadesArray 中获取具有该索引的字节值,并将其保存到我返回的字节数组中。它有点有效,但还不够好。有白线且文字不可读: Converted image

非常感谢任何有关修复它或其他方法的建议!

android arrays kotlin bitmap
1个回答
0
投票

正如@Selvin建议的那样,我应该通过阈值检查每个像素并将二进制转换为十六进制/字节。这是工作版本:

fun convertPictureToByteArray(bitmap: Bitmap): ByteArray {
        val byteArray = ByteArray(15000)
        var index = 0
        var temp = 0

        val pixels = IntArray(bitmap.width * bitmap.height)
        bitmap.getPixels(pixels, 0, bitmap.width, 0, 0, bitmap.width, bitmap.height)
        for(x in (bitmap.height - 1) downTo 0) {
            for(y in 0 until bitmap.width / 8) {
                var tempBinary = ""
                for(z in 0 until 8) {
                    val red = Color.red(pixels[temp])
                    val green = Color.green(pixels[temp])
                    val blue = Color.blue(pixels[temp])

                    val luminance = 0.299 * red + 0.587 * green + 0.114 * blue
                    if(luminance < 128)
                        tempBinary += "0"
                    else
                        tempBinary += "1"
                    temp++
                }
                val decimalValue = Integer.parseInt(tempBinary, 2)
                val hexValue = decimalValue.toString(16).toUpperCase()
                byteArray[index] = hexValue.toInt(16).toByte()
                index++
            }
        }

        return byteArray
    }
© www.soinside.com 2019 - 2024. All rights reserved.