所以我必须将 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 中获取具有该索引的字节值,并将其保存到我返回的字节数组中。它有点有效,但还不够好。有白线且文字不可读:
非常感谢任何有关修复它或其他方法的建议!
正如@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
}