ImageUtils
4.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package com.printer.sdk.usb
import android.graphics.Bitmap
import android.util.Log
import java.util.ArrayList
object ImageUtils {
private const val hexStr = "0123456789ABCDEF"
private val binaryArray = arrayOf("0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111")
fun decodeBitmap(bmp: Bitmap): ByteArray? {
val bmpWidth = bmp.width
val bmpHeight = bmp.height
val list = ArrayList<String>() //binaryString list
var sb: StringBuffer
val zeroCount = bmpWidth % 8
var zeroStr = ""
if (zeroCount > 0) {
for (i in 0 until 8 - zeroCount) {
zeroStr += "0"
}
}
for (i in 0 until bmpHeight) {
sb = StringBuffer()
for (j in 0 until bmpWidth) {
val color = bmp.getPixel(j, i)
val r = color shr 16 and 0xff
val g = color shr 8 and 0xff
val b = color and 0xff
// if color close to white,bit='0', else bit='1'
if (r > 160 && g > 160 && b > 160)
sb.append("0")
else
sb.append("1")
}
if (zeroCount > 0) {
sb.append(zeroStr)
}
list.add(sb.toString())
}
val bmpHexList = binaryListToHexStringList(list)
val commandHexString = "1D763000"
var widthHexString = Integer
.toHexString(if (bmpWidth % 8 == 0)
bmpWidth / 8
else
bmpWidth / 8 + 1)
if (widthHexString.length > 2) {
Log.e("decodeBitmap error", " width is too large")
return null
} else if (widthHexString.length == 1) {
widthHexString = "0$widthHexString"
}
widthHexString += "00"
var heightHexString = Integer.toHexString(bmpHeight)
if (heightHexString.length > 2) {
Log.e("decodeBitmap error", " height is too large")
return null
} else if (heightHexString.length == 1) {
heightHexString = "0$heightHexString"
}
heightHexString += "00"
val commandList = ArrayList<String>()
commandList.add(commandHexString + widthHexString + heightHexString)
commandList.addAll(bmpHexList)
return hexList2Byte(commandList)
}
private fun binaryListToHexStringList(list: List<String>): List<String> {
val hexList = ArrayList<String>()
for (binaryStr in list) {
val sb = StringBuffer()
var i = 0
while (i < binaryStr.length) {
val str = binaryStr.substring(i, i + 8)
val hexString = myBinaryStrToHexString(str)
sb.append(hexString)
i += 8
}
hexList.add(sb.toString())
}
return hexList
}
private fun myBinaryStrToHexString(binaryStr: String): String {
var hex = ""
val f4 = binaryStr.substring(0, 4)
val b4 = binaryStr.substring(4, 8)
for (i in 0 until binaryArray.size) {
if (f4 == binaryArray[i])
hex += hexStr.substring(i, i + 1)
}
for (i in 0 until binaryArray.size) {
if (b4 == binaryArray[i])
hex += hexStr.substring(i, i + 1)
}
return hex
}
private fun hexList2Byte(list: List<String>): ByteArray {
val commandList = ArrayList<ByteArray>()
for (hexStr in list) {
commandList.add(hexStringToBytes(hexStr)!!)
}
return sysCopy(commandList)
}
private fun hexStringToBytes(hexString: String?): ByteArray? {
var hexString = hexString
if (hexString == null || hexString == "") {
return null
}
hexString = hexString.toUpperCase()
val length = hexString.length / 2
val hexChars = hexString.toCharArray()
val d = ByteArray(length)
for (i in 0 until length) {
val pos = i * 2
d[i] = (charToByte(hexChars[pos]).toInt() shl 4 or charToByte(hexChars[pos + 1]).toInt()).toByte()
}
return d
}
fun sysCopy(srcArrays: List<ByteArray>): ByteArray {
var len = 0
for (srcArray in srcArrays) {
len += srcArray.size
}
val destArray = ByteArray(len)
var destLen = 0
for (srcArray in srcArrays) {
System.arraycopy(srcArray, 0, destArray, destLen, srcArray.size)
destLen += srcArray.size
}
return destArray
}
private fun charToByte(c: Char): Byte {
return "0123456789ABCDEF".indexOf(c).toByte()
}
}