├── BitmapTest ├── README.md ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── example │ │ │ └── bitmaptest │ │ │ └── ExampleInstrumentedTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── bitmaptest │ │ │ │ ├── BitmapHelpers.java │ │ │ │ ├── BluetoothOrder.java │ │ │ │ ├── ImageDisposeUtil.java │ │ │ │ ├── MainActivity.java │ │ │ │ ├── PrintBean.java │ │ │ │ ├── PrintDataUtils.java │ │ │ │ └── PrinterModel.java │ │ └── res │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ ├── anime_girl_car.jpg │ │ │ ├── greyscale.png │ │ │ ├── ic_launcher_background.xml │ │ │ └── icon1.png │ │ │ ├── layout │ │ │ └── activity_main.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ │ ├── values-night │ │ │ └── themes.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── themes.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── example │ │ └── bitmaptest │ │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── local.properties └── settings.gradle ├── README.md ├── app ├── README.md └── ble.py ├── ble_connect.py ├── ble_draft.py ├── cat_bytes.py ├── data_bean.md ├── dithering.py ├── iPrint(com.frogtosea.iprint)-1.1.0(18)-base.apk ├── image_process.py ├── iprint_infra.md ├── open_image.py ├── open_json.py └── reverse_stuff ├── black_knight_pic.json ├── black_knight_pic.pcapng ├── black_knight_pic.pichex ├── black_knight_pic.pichex_bkp ├── pic.json ├── rfid-metka-picture.json └── rfid-metka-picture.pichex /BitmapTest/README.md: -------------------------------------------------------------------------------- 1 | # BitmapTest 2 | 3 | Separated part of iPrint code which performs image processing. 4 | -------------------------------------------------------------------------------- /BitmapTest/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /BitmapTest/app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | } 4 | 5 | android { 6 | compileSdk 31 7 | 8 | defaultConfig { 9 | applicationId "com.example.bitmaptest" 10 | minSdk 21 11 | targetSdk 31 12 | versionCode 1 13 | versionName "1.0" 14 | 15 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 16 | } 17 | 18 | buildTypes { 19 | release { 20 | minifyEnabled false 21 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 22 | } 23 | } 24 | compileOptions { 25 | sourceCompatibility JavaVersion.VERSION_1_8 26 | targetCompatibility JavaVersion.VERSION_1_8 27 | } 28 | } 29 | 30 | dependencies { 31 | 32 | implementation 'androidx.appcompat:appcompat:1.3.1' 33 | implementation 'com.google.android.material:material:1.4.0' 34 | implementation 'androidx.constraintlayout:constraintlayout:2.1.1' 35 | testImplementation 'junit:junit:4.+' 36 | androidTestImplementation 'androidx.test.ext:junit:1.1.3' 37 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' 38 | } -------------------------------------------------------------------------------- /BitmapTest/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /BitmapTest/app/src/androidTest/java/com/example/bitmaptest/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.example.bitmaptest; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | assertEquals("com.example.bitmaptest", appContext.getPackageName()); 25 | } 26 | } -------------------------------------------------------------------------------- /BitmapTest/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /BitmapTest/app/src/main/java/com/example/bitmaptest/BitmapHelpers.java: -------------------------------------------------------------------------------- 1 | package com.example.bitmaptest; 2 | 3 | import android.util.Log; 4 | 5 | import java.util.ArrayList; 6 | 7 | public class BitmapHelpers { 8 | 9 | public static int printSize = 384; 10 | public static int eneragy = 12000; 11 | 12 | public static final byte print_text[] = { 81, 120, -66, 0, 1, 0, 1, 7, -1}; 13 | 14 | public static String printHex(byte[] bytesArr) { 15 | StringBuilder sb = new StringBuilder(); 16 | for (byte b : bytesArr) { 17 | sb.append(String.format("%02X ", b)); 18 | } 19 | return sb.toString(); 20 | } 21 | 22 | public static int hex2Dec(char c) { 23 | if (c >= '0' && c <= '9') { return c - 48; } 24 | if (c >= 'A' && c <= 'F') { return (c - 65) + 10; } 25 | return -1; 26 | } 27 | 28 | public static byte[] hexString2Bytes(String s) { 29 | int i = 0; 30 | int str_len = s.length(); 31 | int k = str_len; 32 | Object obj = s; 33 | if (str_len % 2 != 0) { 34 | obj = new StringBuilder(); 35 | ((StringBuilder) (obj)).append("0"); 36 | ((StringBuilder) (obj)).append(s); 37 | obj = ((StringBuilder) (obj)).toString(); 38 | k = str_len + 1; 39 | } 40 | char[] ac = ((String) (obj)).toUpperCase().toCharArray(); 41 | byte[] my_s = new byte[k >> 1]; 42 | for (; i < k; i += 2) 43 | my_s[i >> 1] = (byte) (hex2Dec(ac[i]) << 4 | hex2Dec(ac[i + 1])); 44 | return my_s; 45 | } 46 | 47 | public static byte calcCrc8(byte[] bytes, int i, int j) { 48 | byte[] CHECKSUM_TABLE = { 0, 7, 14, 9, 28, 27, 18, 21, 56, 63, 54, 49, 36, 35, 42, 45, 112, 119, 126, 121, 108, 49 | 107, 98, 101, 72, 79, 70, 65, 84, 83, 90, 93, -32, -25, -18, -23, -4, -5, -14, -11, -40, -33, -42, -47, 50 | -60, -61, -54, -51, -112, -105, -98, -103, -116, -117, -126, -123, -88, -81, -90, -95, -76, -77, -70, 51 | -67, -57, -64, -55, -50, -37, -36, -43, -46, -1, -8, -15, -10, -29, -28, -19, -22, -73, -80, -71, -66, 52 | -85, -84, -91, -94, -113, -120, -127, -122, -109, -108, -99, -102, 39, 32, 41, 46, 59, 60, 53, 50, 31, 53 | 24, 17, 22, 3, 4, 13, 10, 87, 80, 89, 94, 75, 76, 69, 66, 111, 104, 97, 102, 115, 116, 125, 122, -119, 54 | -114, -121, -128, -107, -110, -101, -100, -79, -74, -65, -72, -83, -86, -93, -92, -7, -2, -9, -16, -27, 55 | -30, -21, -20, -63, -58, -49, -56, -35, -38, -45, -44, 105, 110, 103, 96, 117, 114, 123, 124, 81, 86, 56 | 95, 88, 77, 74, 67, 68, 25, 30, 23, 16, 5, 2, 11, 12, 33, 38, 47, 40, 61, 58, 51, 52, 78, 73, 64, 71, 57 | 82, 85, 92, 91, 118, 113, 120, 127, 106, 109, 100, 99, 62, 57, 48, 55, 34, 37, 44, 43, 6, 1, 8, 15, 26, 58 | 29, 20, 19, -82, -87, -96, -89, -78, -75, -68, -69, -106, -111, -104, -97, -118, -115, -124, -125, -34, 59 | -39, -48, -41, -62, -59, -52, -53, -26, -31, -24, -17, -6, -3, -12, -13 }; 60 | byte byte1 = (byte)0; 61 | int byte0 = i; 62 | byte byte2; 63 | for (byte2 = byte1; byte0 < i + j; byte2 = byte1) { 64 | byte1 = CHECKSUM_TABLE[(byte2 ^ bytes[byte0]) & 0xff]; 65 | byte0++; 66 | } 67 | return byte2; 68 | } 69 | 70 | public static byte[] feedPaper(int printSpeed) { 71 | // printSpeed = 30 72 | byte[] bytesArr = new byte[9]; 73 | bytesArr[0] = (byte) 81; 74 | bytesArr[1] = (byte) 120; 75 | bytesArr[2] = (byte) -67; 76 | bytesArr[3] = (byte) 0; 77 | bytesArr[4] = (byte) 1; 78 | bytesArr[5] = (byte) 0; 79 | bytesArr[6] = hexString2Bytes(Integer.toHexString(printSpeed))[0]; 80 | bytesArr[7] = calcCrc8(bytesArr, 6, 1); 81 | bytesArr[8] = (byte) -1; 82 | return bytesArr; 83 | } 84 | 85 | // public void BitmapToData(ArrayList printList, int width, int i, int concentration, boolean flag) { 86 | // if (printList.size() == 0) { 87 | // EventBusUtils.getInstance().post("onWriteFailed"); 88 | // } else { 89 | // final PrinterModel.DataBean model = AppApplication.getPrinterModel(); 90 | // // model = DataBean("GT01", " ", 0, 2, 384, 384, 8, "GT01-", true, 200, 55, 45, 91 | // // 123, 83, true, 2, 4, false, 12000, 12000, 12000, true); 92 | // // 93 | // this.concentration = concentration; // 3 94 | // StringBuilder stringbuilder = new StringBuilder(); 95 | // stringbuilder.append("concentration---"); 96 | // stringbuilder.append(this.concentration); 97 | // LogUtils.e(new Object[] { stringbuilder.toString() }); 98 | // newCompress = flag; 99 | // dataIdentify = new ArrayList(); 100 | // (new Thread(new Runnable() { 101 | // public void run() { 102 | // ArrayList arraylist = new ArrayList(); 103 | // Vector vector = new Vector(); 104 | // vector.addAll(printList); 105 | // // printLattice.length = 19 106 | // packageLength = BluetoothOrder.printLattice.length + 9; // 28 107 | // if (!model.getModelNo().startsWith("LY") && !model.getModelNo().equals("P10") 108 | // && !model.getModelNo().startsWith("GB") && !model.getModelNo().startsWith("GT") 109 | // && !model.getModelNo().startsWith("PR")) { 110 | // setEneragy(0); 111 | // } else { 112 | // // here 113 | // 114 | // SPUtils sputils = SPUtils.getInstance(); 115 | // // ? 116 | // StringBuilder stringbuilder2 = new StringBuilder(); 117 | // stringbuilder2.append(Code.DEV_CONCENTRATION); // Code.DEV_CONCENTRATION="dev_con" 118 | // stringbuilder2.append(SPUtils.getInstance().getString(Code.DEF_DEVICE_ADDRESS)); // Code.DEF_DEVICE_ADDRESS="defDeviceAddress" 119 | // int j = sputils.getInt(stringbuilder2.toString(), 0); 120 | // if (j > 0) { 121 | // // suppose not here 122 | // // getCustomEnergy: [7680, 7680, 9600, 9600, 12000, 12000, 14400, 14400, 17280, 123 | // // 17280, 20000, 20000, 20000, 20000] 124 | // j = ((Integer) PrinterModel.getCustomEnergy(model.getModelNo()).get((j - 1) * 2)) 125 | // .intValue(); 126 | // setEneragy(j); 127 | // } else if (model.getModelNo().equals("LY01")) { 128 | // SPUtils sputils1 = SPUtils.getInstance(); 129 | // StringBuilder stringbuilder1 = new StringBuilder(); 130 | // stringbuilder1.append(Code.LY01_DEF_ENERAGY); 131 | // stringbuilder1.append(SPUtils.getInstance().getString(Code.DEF_DEVICE_ADDRESS)); 132 | // if (sputils1.getBoolean(stringbuilder1.toString(), true)) 133 | // setEneragy(9500); 134 | // else 135 | // setEneragy(20000); 136 | // } else { 137 | // // here ? 138 | // setEneragy(model.getEneragy(concentration)); // 12000 139 | // } 140 | // } 141 | // int l = 0; 142 | // int k; 143 | // int i1; 144 | // for (k = 0; l < vector.size(); k = i1) { 145 | // PrintBean printbean = (PrintBean) vector.get(l); 146 | // i1 = k; 147 | // if (printbean.isShow()) { 148 | // i1 = k; 149 | // if (printbean.getBitmap() != null) { 150 | // // here 151 | // // soooooo say we have a bitmap with width=384, height=800 152 | // byte abyte2[] = PrintDataUtils.bitmapToBWPix(printbean.getBitmap()); 153 | // if (eneragyList != null && eneragyList.size() > 0) { 154 | // i1 = ((Integer) eneragyList.get(l)).intValue(); 155 | // setEneragy(i1); 156 | // } 157 | // // ?? , ?? , 0 or 1 158 | // abyte2 = eachLinePixToCmdB(abyte2, width, printbean.getPrintType()); 159 | // i1 = k; 160 | // if (printbean.isAddWhite()) { 161 | // i1 = k + BluetoothOrder.paper.length; 162 | // arraylist.add(BluetoothOrder.paper); 163 | // } 164 | // i1 += abyte2.length; 165 | // arraylist.add(abyte2); 166 | // } 167 | // } 168 | // l++; 169 | // } 170 | // 171 | // if (eneragyList != null) 172 | // eneragyList.clear(); 173 | // setEneragy(0); 174 | // byte abyte1[] = new byte[(k + BluetoothOrder.paper.length * 2 + 9) * finalPrintNum + 9 175 | // + BluetoothOrder.paper.length * (model.getPaperNum() - 2) 176 | // + BluetoothOrder.printLattice.length + BluetoothOrder.finishLattice.length + 9 177 | // + BluetoothOrder.getDevState.length * 2]; 178 | // System.arraycopy(BluetoothOrder.getDevState, 0, abyte1, 0, BluetoothOrder.getDevState.length); 179 | // k = BluetoothOrder.getDevState.length + 0; 180 | // byte abyte3[] = BluetoothOrder.getBlackening(concentration); 181 | // System.arraycopy(abyte3, 0, abyte1, k, abyte3.length); 182 | // k += abyte3.length; 183 | // System.arraycopy(BluetoothOrder.printLattice, 0, abyte1, k, BluetoothOrder.printLattice.length); 184 | // k += BluetoothOrder.printLattice.length; 185 | // for (l = 0; l < finalPrintNum; l++) { 186 | // for (Iterator iterator = arraylist.iterator(); iterator.hasNext();) { 187 | // byte abyte4[] = (byte[]) iterator.next(); 188 | // System.arraycopy(abyte4, 0, abyte1, k, abyte4.length); 189 | // k += abyte4.length; 190 | // } 191 | // 192 | // byte abyte5[] = feedPaper(25); 193 | // System.arraycopy(abyte5, 0, abyte1, k, abyte5.length); 194 | // k += abyte5.length; 195 | // if (model.getDevdpi() == 200) 196 | // System.arraycopy(BluetoothOrder.paper, 0, abyte1, k, BluetoothOrder.paper.length); 197 | // else if (model.getDevdpi() == 300) 198 | // System.arraycopy(BluetoothOrder.paper_300dpi, 0, abyte1, k, 199 | // BluetoothOrder.paper_300dpi.length); 200 | // else 201 | // System.arraycopy(BluetoothOrder.paper, 0, abyte1, k, BluetoothOrder.paper.length); 202 | // k += BluetoothOrder.paper.length; 203 | // if (model.getDevdpi() == 200) 204 | // System.arraycopy(BluetoothOrder.paper, 0, abyte1, k, BluetoothOrder.paper.length); 205 | // else if (model.getDevdpi() == 300) 206 | // System.arraycopy(BluetoothOrder.paper_300dpi, 0, abyte1, k, 207 | // BluetoothOrder.paper_300dpi.length); 208 | // else 209 | // System.arraycopy(BluetoothOrder.paper, 0, abyte1, k, BluetoothOrder.paper.length); 210 | // k += BluetoothOrder.paper.length; 211 | // } 212 | // 213 | // byte abyte0[] = feedPaper(25); 214 | // System.arraycopy(abyte0, 0, abyte1, k, abyte0.length); 215 | // k += abyte0.length; 216 | // for (l = 0; l < model.getPaperNum() - 2; l++) { 217 | // if (model.getDevdpi() == 200) 218 | // System.arraycopy(BluetoothOrder.paper, 0, abyte1, k, BluetoothOrder.paper.length); 219 | // else if (model.getDevdpi() == 300) 220 | // System.arraycopy(BluetoothOrder.paper_300dpi, 0, abyte1, k, 221 | // BluetoothOrder.paper_300dpi.length); 222 | // else 223 | // System.arraycopy(BluetoothOrder.paper, 0, abyte1, k, BluetoothOrder.paper.length); 224 | // k += BluetoothOrder.paper.length; 225 | // } 226 | // 227 | // System.arraycopy(BluetoothOrder.finishLattice, 0, abyte1, k, BluetoothOrder.finishLattice.length); 228 | // l = BluetoothOrder.finishLattice.length; 229 | // System.arraycopy(BluetoothOrder.getDevState, 0, abyte1, k + l, BluetoothOrder.getDevState.length); 230 | // EventBusUtils.getInstance().post(Code.STARTPRINT, abyte1); 231 | // } 232 | // 233 | // final PrintDataUtils this$0; 234 | // final int val$concentration; 235 | // final int val$finalPrintNum; 236 | // final PrinterModel.DataBean val$model; 237 | // final ArrayList val$printList; 238 | // final int val$width; 239 | // 240 | // { 241 | // this$0 = PrintDataUtils.this; 242 | // printList = arraylist; 243 | // model = databean; 244 | // concentration = i; 245 | // width = j; 246 | // finalPrintNum = k; 247 | // super(); 248 | // } 249 | // })).start(); 250 | // return; 251 | // } 252 | // } 253 | 254 | // public byte[] eachLinePixToCmdB(byte[] inputBitmap, int width, int j_print_type) { 255 | // // j_print_type = 0 256 | // // inputBitmap = bitmap 257 | // // width = 384 258 | // byte tmpBitmap[]; 259 | // ArrayList arraylist, arrayList2 = new ArrayList(); 260 | // 261 | // int height = inputBitmap.length / width; // 800, ex k 262 | // int i1 = width / 8; // 48 263 | // byte byte0 = 10; 264 | // 265 | // if (eneragy != 0) { 266 | // // tmpBitmap = new byte[width * height + 28] 267 | // tmpBitmap = new byte[width * height + print_text.length + 9 + 10]; // 307228 268 | // 269 | // byte[] abyte2 = new byte[10]; 270 | // abyte2[0] = (byte) 81; 271 | // abyte2[1] = (byte) 120; 272 | // abyte2[2] = (byte) -81; 273 | // abyte2[3] = (byte) 0; 274 | // abyte2[4] = (byte) 2; 275 | // abyte2[5] = (byte) 0; 276 | // abyte2[6] = hexString2Bytes(Integer.toHexString(eneragy))[1]; // 46 277 | // abyte2[7] = hexString2Bytes(Integer.toHexString(eneragy))[0]; // 224 278 | // abyte2[8] = calcCrc8(abyte2, 6, 2); // -104 279 | // abyte2[9] = (byte) -1; 280 | // // abyte2[] = { 81, 120, -81, 0, 2, 0, 46, 224, -104, -1 }; 281 | // // arraycopy(src, srcPos, dest, int, length) 282 | // System.arraycopy(abyte2, 0, tmpBitmap, 0, abyte2.length); 283 | // // tmpBitmap = { 81, 120, -81, 0, 2, 0, 46, 224, -104, -1, 00, 00, 00, ...} 284 | // packageLength = packageLength + 10; // 38 285 | // } else { 286 | // tmpBitmap = new byte[width * k + BluetoothOrder.print_text.length + 9]; 287 | // byte0 = 0; 288 | // } 289 | // if (j_print_type == Code.TEXT_PRINT_TYPE) { 290 | // System.arraycopy(print_text, 0, tmpBitmap, byte0, print_text.length); 291 | // j1 = byte0 + BluetoothOrder.print_text.length; 292 | // packageLength = packageLength + BluetoothOrder.print_text.length; 293 | // if (getTextSpeed() == 0) 294 | // j_print_type = AppApplication.getTextPrintSpeed(); 295 | // else 296 | // j_print_type = getTextSpeed(); 297 | // StringBuilder stringbuilder = new StringBuilder(); 298 | // stringbuilder.append("textSpeed-----"); 299 | // stringbuilder.append(j); 300 | // LogUtils.e(new Object[] { stringbuilder.toString() }); 301 | // byte abyte3[] = feedPaper(j); 302 | // System.arraycopy(abyte3, 0, tmpBitmap, j1, abyte3.length); 303 | // j_print_type = AppApplication.getPrintTextMtu(); 304 | // if (j != 0) 305 | // AppApplication.getInstance().getBle().setPerLength(j); 306 | // else 307 | // AppApplication.getInstance().getBle().setPerLength(23); 308 | // } else if (j_print_type == Code.IMG_PRINT_TYPE) { 309 | // eneragy = byte0; // 10 310 | // AppApplication.getPrinterModel().getModelNo(); 311 | // // byte print_img[] = { 81, 120, -66, 0, 1, 0, 0, 0, -1 }; 312 | // System.arraycopy(BluetoothOrder.print_img, 0, tmpBitmap, byte0, BluetoothOrder.print_img.length); 313 | // // byte0[] = { 51 78 AF 00 02 00 2E E0 98 FF 51 78 BE 00 01 00 00 00 FF 00 ... } 314 | // eneragy = byte0 + BluetoothOrder.print_img.length; // 19 315 | // packageLength = packageLength + BluetoothOrder.print_img.length; // 38 + 9 = 47 316 | // if (getImgSpeed() == 0) 317 | // j_print_type = AppApplication.getImgPrintSpeed(); 318 | // else 319 | // j_print_type = getImgSpeed(); 320 | // // j_print_type = 30 321 | // StringBuilder stringbuilder1 = new StringBuilder(); 322 | // stringbuilder1.append("imgSpeed-----"); 323 | // stringbuilder1.append(j_print_type); 324 | // LogUtils.e(new Object[] { stringbuilder1.toString() }); 325 | // byte abyte4[] = feedPaper(j_print_type); // 51 78 BD 00 01 00 1E 5A FF 326 | // System.arraycopy(abyte4, 0, tmpBitmap, j1, abyte4.length); 327 | // j_print_type = AppApplication.getPrinterMtu(); // 0 ??? 328 | // if (j_print_type != 0) 329 | // AppApplication.getInstance().getBle().setPerLength(j_print_type); 330 | // else 331 | // AppApplication.getInstance().getBle().setPerLength(23); // guess this 332 | // } 333 | // int j2 = eneragy + 9; // 19 + 9 = 28 334 | // packageLength = packageLength + 9; // 47 + 9 = 56 335 | // // byte0 = 0; 336 | // int k2 = 0; 337 | // int l2 = 0; 338 | // // j_print_type = height; 339 | // for (int l = 0; l < height;) { 340 | // int i3 = k2 + 8; 341 | // arraylist.clear(); 342 | // arraylist1.clear(); 343 | // int k1; 344 | // int l3; 345 | // if (newCompress) { 346 | // int j3 = 0; 347 | // boolean flag = false; 348 | // k1 = 0; 349 | // k2 = 0; 350 | // l3 = 0; 351 | // do { 352 | // if (j3 >= width) 353 | // break; 354 | // byte byte1 = inputBitmap[l2 + j3]; 355 | // int l1; 356 | // if (j3 == 0 || l3 == byte1) { 357 | // l1 = k1 + 1; 358 | // } else { 359 | // dataTrim(k1, l3, arraylist1); 360 | // l1 = 1; 361 | // } 362 | // if (byte1 != 0 && k2 == 0) 363 | // k2 = 1; 364 | // if (arraylist1.size() > i1) { 365 | // k1 = l1; 366 | // break; 367 | // } 368 | // k1 = l1; 369 | // if (j3 == i - 1) { 370 | // k1 = l1; 371 | // if (l1 != 0) { 372 | // k1 = l1; 373 | // if (k2 != 0) { 374 | // dataTrim(l1, byte1, arraylist1); 375 | // k1 = 0; 376 | // } 377 | // } 378 | // } 379 | // j3++; 380 | // l1 = byte1; 381 | // l3 = l1; 382 | // } while (true); 383 | // } else { 384 | // boolean flag1 = false; 385 | // k1 = 0; 386 | // k2 = 0; 387 | // l3 = 0; 388 | // } 389 | // int i2 = l2 + i; 390 | // if (arraylist1.size() <= i1 && newCompress) { 391 | // arraylist.addAll(arraylist1); 392 | // } else { 393 | // arraylist.clear(); 394 | // l2 = i2 - i; 395 | // arraylist.add(Byte.valueOf((byte) -1)); 396 | // int k3 = 0; 397 | // do { 398 | // i2 = l2; 399 | // if (k3 >= i1) 400 | // break; 401 | // byte byte2 = (byte) (p0[inputBitmap[l2 + 7]] + p1[inputBitmap[l2 + 6]] + p2[inputBitmap[l2 + 5]] 402 | // + p3[inputBitmap[l2 + 4]] + p4[inputBitmap[l2 + 3]] + p5[inputBitmap[l2 + 2]] + p6[inputBitmap[l2 + 1]] 403 | // + inputBitmap[l2 + 0]); 404 | // l2 += 8; 405 | // arraylist.add(Byte.valueOf(byte2)); 406 | // k3++; 407 | // } while (true); 408 | // } 409 | // if (k2 == 0 && arraylist.size() == 0) 410 | // dataTrim(k1, l3, arraylist); 411 | // if (arraylist.size() > 0) { 412 | // byte abyte5[] = new byte[arraylist.size()]; 413 | // for (k1 = 0; k1 < arraylist.size(); k1++) 414 | // abyte5[k1] = ((Byte) arraylist.get(k1)).byteValue(); 415 | // 416 | // k2 = i3 + arraylist.size(); 417 | // String s = Integer.toHexString(abyte5.length); 418 | // tmpBitmap[j2 + 0] = (byte) 81; 419 | // tmpBitmap[j2 + 1] = (byte) 120; 420 | // if (abyte5[0] == -1 && abyte5.length == i1 + 1) { 421 | // tmpBitmap[j2 + 2] = (byte) -94; 422 | // k2--; 423 | // s = Integer.toHexString(i1); 424 | // } else { 425 | // tmpBitmap[j2 + 2] = (byte) -65; 426 | // } 427 | // tmpBitmap[j2 + 3] = (byte) 0; 428 | // tmpBitmap[j2 + 4] = ConvertUtils.hexString2Bytes(s)[0]; 429 | // tmpBitmap[j2 + 5] = (byte) 0; 430 | // if (abyte5[0] == -1 && abyte5.length == i1 + 1) 431 | // System.arraycopy(abyte5, 1, tmpBitmap, j2 + 6, abyte5.length - 1); 432 | // else 433 | // System.arraycopy(abyte5, 0, tmpBitmap, j2 + 6, abyte5.length); 434 | // if (abyte5[0] == -1 && abyte5.length == i1 + 1) { 435 | // k1 = j2 + 6; 436 | // tmpBitmap[k1 + i1] = BluetoothOrder.calcCrc8(tmpBitmap, k1, i1); 437 | // tmpBitmap[j2 + 7 + i1] = (byte) -1; 438 | // k1 = j2 + 8 + i1; 439 | // packageLength = packageLength + 8 + i1; 440 | // } else { 441 | // k1 = j2 + 6; 442 | // tmpBitmap[abyte5.length + k1] = BluetoothOrder.calcCrc8(tmpBitmap, k1, abyte5.length); 443 | // tmpBitmap[j2 + 7 + abyte5.length] = (byte) -1; 444 | // k1 = j2 + 8 + abyte5.length; 445 | // packageLength = packageLength + 8 + abyte5.length; 446 | // } 447 | // } else { 448 | // k1 = j2; 449 | // k2 = i3; 450 | // } 451 | // l++; 452 | // l2 = i2; 453 | // j2 = k1; 454 | // } 455 | // 456 | // if (getEneragy() != 0) 457 | // inputBitmap = new byte[k2 + BluetoothOrder.print_text.length + 19]; 458 | // else 459 | // inputBitmap = new byte[k2 + BluetoothOrder.print_text.length + 9]; 460 | // System.arraycopy(tmpBitmap, 0, inputBitmap, 0, inputBitmap.length); 461 | // return inputBitmap; 462 | // } 463 | 464 | } 465 | -------------------------------------------------------------------------------- /BitmapTest/app/src/main/java/com/example/bitmaptest/BluetoothOrder.java: -------------------------------------------------------------------------------- 1 | package com.example.bitmaptest; 2 | 3 | import java.util.UUID; 4 | 5 | 6 | public class BluetoothOrder { 7 | private static final byte[] CHECKSUM_TABLE = {0, 7, 14, 9, 28, 27, 18, 21, 56, 63, 54, 49, 36, 35, 42, 45, 112, 119, 126, 121, 108, 107, 98, 101, 72, 79, 70, 65, 84, 83, 90, 93, -32, -25, -18, -23, -4, -5, -14, -11, -40, -33, -42, -47, -60, -61, -54, -51, -112, -105, -98, -103, -116, -117, -126, -123, -88, -81, -90, -95, -76, -77, -70, -67, -57, -64, -55, -50, -37, -36, -43, -46, -1, -8, -15, -10, -29, -28, -19, -22, -73, -80, -71, -66, -85, -84, -91, -94, -113, -120, -127, -122, -109, -108, -99, -102, 39, 32, 41, 46, 59, 60, 53, 50, 31, 24, 17, 22, 3, 4, 13, 10, 87, 80, 89, 94, 75, 76, 69, 66, 111, 104, 97, 102, 115, 116, 125, 122, -119, -114, -121, Byte.MIN_VALUE, -107, -110, -101, -100, -79, -74, -65, -72, -83, -86, -93, -92, -7, -2, -9, -16, -27, -30, -21, -20, -63, -58, -49, -56, -35, -38, -45, -44, 105, 110, 103, 96, 117, 114, 123, 124, 81, 86, 95, 88, 77, 74, 67, 68, 25, 30, 23, 16, 5, 2, 11, 12, 33, 38, 47, 40, 61, 58, 51, 52, 78, 73, 64, 71, 82, 85, 92, 91, 118, 113, 120, Byte.MAX_VALUE, 106, 109, 100, 99, 62, 57, 48, 55, 34, 37, 44, 43, 6, 1, 8, 15, 26, 29, 20, 19, -82, -87, -96, -89, -78, -75, -68, -69, -106, -111, -104, -97, -118, -115, -124, -125, -34, -39, -48, -41, -62, -59, -52, -53, -26, -31, -24, -17, -6, -3, -12, -13}; 8 | public static final byte[] finishLattice = {81, 120, -90, 0, 11, 0, -86, 85, 23, 0, 0, 0, 0, 0, 0, 0, 23, 17, -1}; 9 | public static final byte[] getDevId = {81, 120, -69, 0, 1, 0, 1, 7, -1}; 10 | public static final byte[] getDevInfo = {81, 120, -88, 0, 1, 0, 0, 0, -1}; 11 | public static final byte[] getDevState = {81, 120, -93, 0, 1, 0, 0, 0, -1}; 12 | public static final byte[] paper = {81, 120, -95, 0, 2, 0, 48, 0, -7, -1}; 13 | public static final byte[] paper_300dpi = {81, 120, -95, 0, 2, 0, 72, 0, -13, -1}; 14 | public static final byte[] printLattice = {81, 120, -90, 0, 11, 0, -86, 85, 23, 56, 68, 95, 95, 95, 68, 56, 44, -95, -1}; 15 | public static final byte[] print_img = {81, 120, -66, 0, 1, 0, 0, 0, -1}; 16 | public static final byte[] print_text = {81, 120, -66, 0, 1, 0, 1, 7, -1}; 17 | public static final byte[] quality1 = {81, 120, -92, 0, 1, 0, 49, -105, -1}; 18 | public static final byte[] quality2 = {81, 120, -92, 0, 1, 0, 50, -98, -1}; 19 | public static final byte[] quality3 = {81, 120, -92, 0, 1, 0, 51, -103, -1}; 20 | public static final byte[] quality4 = {81, 120, -92, 0, 1, 0, 52, -116, -1}; 21 | public static final byte[] quality5 = {81, 120, -92, 0, 1, 0, 53, -117, -1}; 22 | public static final UUID[] serviceUUID = {UUID.fromString("0000AE00-0000-1000-8000-00805F9B34FB"), UUID.fromString("0000FF00-0000-1000-8000-00805F9B34FB"), UUID.fromString("0000AB00-0000-1000-8000-00805F9B34FB")}; 23 | public static final byte[] speed_moderation = {81, 120, -92, 0, 1, 0, 35, -23, -1}; 24 | public static final byte[] speed_thick = {81, 120, -92, 0, 1, 0, 37, -5, -1}; 25 | public static final byte[] speed_thin = {81, 120, -92, 0, 1, 0, 34, -18, -1}; 26 | public static final byte[] updateDev = {81, 120, -87, 0, 1, 0, 0, 0, -1}; 27 | public static final byte[] wifiData = {81, 120, -86, 0, 10, 0, 51, 54, 48, 115, 117, 110, 112, 101, 110, 103, 1, -1, 81, 120, -85, 0, 8, 0, 51, 53, 56, 56, 55, 51, 53, 49, -87, -1}; 28 | public static final UUID[] writeUUid = {UUID.fromString("0000AE01-0000-1000-8000-00805F9B34FB"), UUID.fromString("0000FF02-0000-1000-8000-00805F9B34FB"), UUID.fromString("0000AB01-0000-1000-8000-00805F9B34FB")}; 29 | 30 | public static String getDevType(int i) { 31 | return "XW00" + i; 32 | } 33 | 34 | public static byte[] getBlackening(int i, PrinterModel.DataBean model) 35 | { 36 | String s = model.getModelNo(); 37 | if(i == 2) 38 | if(!s.equals("M01") && !s.equals("XW003") && !s.equals("PR") && !s.equals("JX001")) 39 | return quality2; 40 | else 41 | return quality3; 42 | if(i == 3) 43 | if(!s.equals("M01") && !s.equals("XW003") && !s.equals("XW001") && !s.equals("PR") && !s.equals("JX001")) 44 | return quality3; 45 | else 46 | return quality4; 47 | if(i == 5) { 48 | if(s.equals("GB01")) 49 | return quality4; 50 | else 51 | return quality5; 52 | } else { 53 | return quality3; 54 | } 55 | } 56 | 57 | public static byte[] sendWifi(String str, String str2) { 58 | byte[] bytes = str.getBytes(); 59 | byte[] bytes2 = str2.getBytes(); 60 | byte[] bArr = new byte[(bytes.length + 8 + bytes2.length + 8)]; 61 | byte[] int2byte = int2byte(bytes.length); 62 | byte[] int2byte2 = int2byte(str2.length()); 63 | bArr[0] = 81; 64 | bArr[1] = 120; 65 | bArr[2] = -86; 66 | bArr[3] = 0; 67 | bArr[4] = int2byte[0]; 68 | bArr[5] = 0; 69 | for (int i = 0; i < bytes.length; i++) { 70 | bArr[i + 6] = bytes[i]; 71 | } 72 | bArr[bytes.length + 6] = calcCrc8(bytes); 73 | bArr[bytes.length + 7] = -1; 74 | bArr[bytes.length + 8] = 81; 75 | bArr[bytes.length + 9] = 120; 76 | bArr[bytes.length + 10] = -85; 77 | bArr[bytes.length + 11] = 0; 78 | bArr[bytes.length + 12] = int2byte2[0]; 79 | bArr[bytes.length + 13] = 0; 80 | for (int i2 = 0; i2 < bytes2.length; i2++) { 81 | bArr[i2 + 14 + bytes.length] = bytes2[i2]; 82 | } 83 | bArr[bytes.length + 14 + bytes2.length] = calcCrc8(bytes2); 84 | bArr[bytes.length + 15 + bytes2.length] = -1; 85 | return bArr; 86 | } 87 | 88 | public static byte[] sendDateToWifi(String str, String str2) { 89 | byte[] bytes = (str + str2).getBytes(); 90 | byte[] bArr = new byte[(bytes.length + 10)]; 91 | byte[] int2byte = int2byte(bytes.length + 2); 92 | bArr[0] = 81; 93 | bArr[1] = 120; 94 | bArr[2] = -91; 95 | bArr[3] = 0; 96 | bArr[4] = int2byte[0]; 97 | bArr[5] = 0; 98 | bArr[6] = 0; 99 | bArr[7] = -96; 100 | for (int i = 0; i < bytes.length; i++) { 101 | bArr[i + 8] = bytes[i]; 102 | } 103 | bArr[bytes.length + 8] = calcCrc8(bArr, 6, bytes.length + 2); 104 | bArr[bytes.length + 9] = -1; 105 | return bArr; 106 | } 107 | 108 | public static byte[] int2byte(int i) { 109 | return (new byte[] { 110 | (byte)(i & 0xff), (byte)(i >> 8 & 0xff), (byte)(i >> 16 & 0xff), (byte)(i >>> 24) 111 | }); 112 | } 113 | 114 | public static byte[] sendWifiPw(String str) { 115 | byte[] bytes = str.getBytes(); 116 | byte[] bArr = new byte[(bytes.length + 8)]; 117 | byte[] int2byte = int2byte(bytes.length); 118 | bArr[0] = 81; 119 | bArr[1] = 120; 120 | bArr[2] = -85; 121 | bArr[3] = 0; 122 | bArr[4] = int2byte[0]; 123 | bArr[5] = 0; 124 | for (int i = 0; i < bytes.length; i++) { 125 | bArr[i + 6] = bytes[i]; 126 | } 127 | bArr[bArr.length - 2] = calcCrc8(bytes); 128 | bArr[bArr.length - 1] = -1; 129 | return bArr; 130 | } 131 | 132 | public static byte calcCrc8(byte[] bArr) { 133 | return calcCrc8(bArr, 0, bArr.length, (byte) 0); 134 | } 135 | 136 | public static byte calcCrc8(byte[] bArr, int i, int i2) { 137 | return calcCrc8(bArr, i, i2, (byte) 0); 138 | } 139 | 140 | public static byte calcCrc8(byte[] bArr, int i, int i2, byte b) { 141 | byte b2 = b; 142 | for (int i3 = i; i3 < i + i2; i3++) { 143 | b2 = CHECKSUM_TABLE[(b2 ^ bArr[i3]) & 255]; 144 | } 145 | return b2; 146 | } 147 | 148 | public static byte[] writeDevId(String str) { 149 | if (str.length() != 12) { 150 | return null; 151 | } 152 | byte[] hexToByteArray = hexToByteArray("00" + str); 153 | byte[] bArr = new byte[(hexToByteArray.length + 8)]; 154 | bArr[0] = 81; 155 | bArr[1] = 120; 156 | bArr[2] = -69; 157 | bArr[3] = 0; 158 | bArr[4] = 7; 159 | bArr[5] = 0; 160 | for (int i = 0; i < hexToByteArray.length; i++) { 161 | bArr[i + 6] = hexToByteArray[i]; 162 | } 163 | bArr[bArr.length - 2] = calcCrc8(hexToByteArray); 164 | bArr[bArr.length - 1] = -1; 165 | return bArr; 166 | } 167 | 168 | public static byte[] hexToByteArray(String str) { 169 | byte[] bArr; 170 | int length = str.length(); 171 | 172 | if (length % 2 == 1) { 173 | length++; 174 | bArr = new byte[(length / 2)]; 175 | 176 | StringBuilder sbStr = new StringBuilder(); 177 | sbStr.append("0"); 178 | sbStr.append(str); 179 | str = sbStr.toString(); 180 | } else { 181 | bArr = new byte[(length / 2)]; 182 | } 183 | int i = 0; 184 | int i2 = 0; 185 | while (i < length) { 186 | int i3 = i + 2; 187 | bArr[i2] = hexToByte(str.substring(i, i3)); 188 | i2++; 189 | i = i3; 190 | } 191 | return bArr; 192 | } 193 | 194 | public static byte hexToByte(String str) { 195 | return (byte) Integer.parseInt(str, 16); 196 | } 197 | } 198 | -------------------------------------------------------------------------------- /BitmapTest/app/src/main/java/com/example/bitmaptest/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.bitmaptest; 2 | 3 | import androidx.appcompat.app.AppCompatActivity; 4 | 5 | import android.graphics.BitmapFactory; 6 | import android.graphics.drawable.BitmapDrawable; 7 | import android.os.Bundle; 8 | import android.util.Log; 9 | import android.view.View; 10 | import android.widget.Button; 11 | import android.widget.ImageView; 12 | import android.graphics.Bitmap; 13 | import android.widget.LinearLayout; 14 | 15 | import java.util.ArrayList; 16 | import java.util.Iterator; 17 | import java.util.List; 18 | 19 | 20 | public class MainActivity extends AppCompatActivity { 21 | 22 | PrinterModel pm = new PrinterModel(); 23 | PrinterModel.DataBean model = pm.getModel("no"); 24 | PrintDataUtils printDataUtils = new PrintDataUtils(); 25 | private Button btn; 26 | private ImageView image1, image2; 27 | private String TAG = pm.deviceName; 28 | private String code = "idk some param"; 29 | private String type; 30 | private int printImageUrl = PrintDataUtils.IMG_PRINT_TYPE; 31 | private boolean needCrop = false; 32 | private int rotateNum = 0; 33 | private int fontSize = 8; 34 | private List originalBitmapList; 35 | 36 | private ArrayList landprintList = new ArrayList<>(); 37 | private boolean showLandScape = false; 38 | 39 | private ArrayList list = new ArrayList<>(); 40 | public Bitmap printBitmap = null; 41 | int label_thumbnail_view4 = 5000; 42 | private ArrayList printList = new ArrayList<>(); 43 | 44 | private ImageDisposeUtil imageDisposeUtil = new ImageDisposeUtil(); 45 | 46 | 47 | // public void PrintBitmap(int flag) { 48 | // if (flag == 1) { 49 | // //if (Code.QUESTION_HTML.equals(this.type) || Code.XUEKEWANG_HTML.equals(this.type)) { 50 | // if (this.code.equals("idk some param")) { 51 | // Bitmap bitmap = imageDisposeUtil.getBitmap("猫屁股", fontSize, true); 52 | // if (bitmap.getWidth() < model.getPrintSize()) { 53 | // bitmap = imageDisposeUtil.mergeBitmap(bitmap); 54 | // } 55 | // PrintBean printBean = new PrintBean(); 56 | // printBean.setShow(true); 57 | // printBean.setBitmap(bitmap); 58 | // this.list.add(printBean); 59 | // } 60 | //// // Can't decompile imageDisposeUtil.corpLandImg 61 | ////// if (this.showLandScape) { 62 | ////// if (this.landprintList.size() > 0) { 63 | ////// if (this.landprintList.get(0).getBitmap().getWidth() != model.getPaperSize()) { 64 | ////// // Can't decompile imageDisposeUtil.corpLandImg 65 | ////// ArrayList corpLandImg = imageDisposeUtil.corpLandImg(ViewToBitmap.scrollViewScreenShot(this.webLandscapeScrollview)); 66 | ////// this.landprintList.clear(); 67 | ////// 68 | ////// Iterator it = corpLandImg.iterator(); 69 | ////// while (it.hasNext()) { 70 | ////// Bitmap next = it.next(); 71 | ////// if (next.getWidth() < model.getPrintSize()) { 72 | ////// next = imageDisposeUtil.mergeBitmap(next); 73 | ////// } 74 | ////// PrintBean printBean2 = new PrintBean(); 75 | ////// printBean2.setShow(true); 76 | ////// printBean2.setBitmap(next); 77 | ////// printBean2.setIstext(true); 78 | ////// this.landprintList.add(printBean2); 79 | ////// } 80 | ////// } 81 | ////// this.list.addAll(this.landprintList); 82 | ////// } 83 | ////// if (this.list.size() > 0) { 84 | ////// return; 85 | ////// } 86 | ////// return; 87 | ////// } 88 | // this.printBitmap = ViewToBitmap.scrollViewScreenShot((NestedScrollView) this.webScrollview); 89 | // // this.printBitmap = imageDisposeUtil.printText(this.printBitmap); 90 | // this.printBitmap = imageDisposeUtil.fitBitmap(this.printBitmap, model.getPaperSize(), true, true); 91 | // if (this.printBitmap.getWidth() < model.getPrintSize()) { 92 | // this.printBitmap = imageDisposeUtil.mergeBitmap(this.printBitmap); 93 | // } 94 | // PrintBean printBean3 = new PrintBean(); 95 | // printBean3.setPrintType(PrintDataUtils.TEXT_PRINT_TYPE); 96 | // printBean3.setBitmap(this.printBitmap); 97 | // this.list.add(printBean3); 98 | // } else if (flag == 2) { 99 | // if (this.code.equals("idk some param")) { 100 | // try { 101 | // this.printBitmap = ViewToBitmap.scrollViewScreenShot((NestedScrollView) this.webScrollview); 102 | // int height = this.printBitmap.getHeight(); 103 | // ArrayList arrayList = new ArrayList(); 104 | // // crop image height to 5000 105 | // if (height > 5000) { 106 | // int i = label_thumbnail_view4; 107 | // int i2 = 0; 108 | // while (height > i2) { 109 | // int i3 = height - i2; 110 | // int i4 = i3 < 5000 ? i3 : i; 111 | // Bitmap cropBitmapCustom = imageDisposeUtil.cropBitmapCustom(this.printBitmap, 0, i2, this.printBitmap.getWidth(), i4, false); 112 | // i2 += i4; 113 | // arrayList.add(cropBitmapCustom); 114 | // i = i4; 115 | // } 116 | // } else { 117 | // arrayList.add(this.printBitmap); 118 | // } 119 | // Iterator it2 = arrayList.iterator(); 120 | // while (it2.hasNext()) { 121 | // Bitmap fitBitmap = imageDisposeUtil.fitBitmap(imageDisposeUtil.printText((Bitmap) it2.next()), model.getPaperSize(), true, true); 122 | // if (fitBitmap.getWidth() < model.getPrintSize()) { 123 | // fitBitmap = imageDisposeUtil.mergeBitmap(fitBitmap); 124 | // } 125 | // PrintBean printBean4 = new PrintBean(); 126 | // printBean4.setPrintType(PrintDataUtils.TEXT_PRINT_TYPE); 127 | // printBean4.setBitmap(fitBitmap); 128 | // this.list.add(printBean4); 129 | // } 130 | // } catch (OutOfMemoryError unused) { } 131 | // } else { 132 | // Iterator it3 = this.printList.iterator(); 133 | // while (it3.hasNext()) { 134 | // PrintBean next2 = it3.next(); 135 | // Bitmap bitmap2 = next2.getBitmap(); 136 | // if (bitmap2.getWidth() < model.getPrintSize()) { 137 | // next2.setBitmap(imageDisposeUtil.mergeBitmap(bitmap2)); 138 | // } 139 | // } 140 | // this.list.addAll(this.printList); 141 | // } 142 | // } else if (flag == 3) { 143 | // this.printBitmap = ViewToBitmap.scrollViewScreenShot((NestedScrollView) this.webScrollview); 144 | // if (this.code.equals("idk some param")) { 145 | // Bitmap bitmap = imageDisposeUtil.getBitmap("猫屁股", fontSize, true); 146 | // if (bitmap.getWidth() < model.getPrintSize()) { 147 | // bitmap = imageDisposeUtil.mergeBitmap(bitmap); 148 | // } 149 | // PrintBean printBean = new PrintBean(); 150 | // printBean.setShow(true); 151 | // printBean.setBitmap(bitmap); 152 | // this.list.add(0, printBean); 153 | // } 154 | // //this.printBitmap = imageDisposeUtil.printText(this.printBitmap); 155 | // this.printBitmap = imageDisposeUtil.fitBitmap(this.printBitmap, model.getPaperSize(), true, true); 156 | // if (this.printBitmap.getWidth() < model.getPrintSize()) { 157 | // this.printBitmap = imageDisposeUtil.mergeBitmap(this.printBitmap); 158 | // } 159 | // PrintBean printBean2 = new PrintBean(); 160 | // printBean2.setPrintType(PrintDataUtils.TEXT_PRINT_TYPE); 161 | // printBean2.setBitmap(this.printBitmap); 162 | // this.list.add(printBean2); 163 | // } else { 164 | // Bitmap bitmap; 165 | // if (this.printList.size() > 0) { 166 | // Bitmap bitmap2 = null; 167 | // if (this.code.equals("idk some param")) { 168 | // bitmap2 = imageDisposeUtil.getBitmap("猫屁股", fontSize, true); 169 | // if (bitmap2.getWidth() < model.getPrintSize()) { 170 | // bitmap2 = imageDisposeUtil.mergeBitmap(bitmap2); 171 | // } 172 | // } 173 | // int i = 0; 174 | // while (i < this.printList.size()) { 175 | // if (this.originalBitmapList.size() > i) { 176 | // PrintBean printBean = (PrintBean)this.printList.get(i); 177 | // PrintImageView childAt = PrintPreviewActivity.this.linearImg.getChildAt(i); 178 | // Bitmap bitmap3 = (Bitmap) PrintPreviewActivity.this.originalBitmapList.get(i); 179 | // if (bitmap3 == null) { 180 | // break; 181 | // } 182 | // if (printBean.getPrintType() != PrintDataUtils.IMG_PRINT_TYPE || bitmap3 == null) { 183 | // if (this.code.equals("idk some param") && !Code.PRINT_STREAMER.equals(PrintPreviewActivity.this.activityType)) { 184 | // // bitmap3 = imageDisposeUtil.printText(bitmap3); 185 | // } 186 | // Bitmap fitBitmap1 = imageDisposeUtil.fitBitmap1(bitmap3, model.getPrintSize()); 187 | // bitmap = (childAt == null || "cut".equals(childAt.getImgTag())) ? fitBitmap1 : (i != 0 || bitmap2 == null) ? childAt.mergeBitmap(fitBitmap1) : childAt.mergeBitmap(fitBitmap1, bitmap2); 188 | // } else { 189 | // bitmap = imageDisposeUtil.getShowBitmap(imageDisposeUtil.fitBitmap1(childAt.mergeBitmap(bitmap3), model.getPrintSize())); 190 | // } 191 | // if (bitmap.getWidth() < model.getPrintSize()) { 192 | // bitmap = imageDisposeUtil.mergeBitmap(bitmap); 193 | // } 194 | // printBean.setBitmap(bitmap); 195 | // } 196 | // i++; 197 | // } 198 | // this.list.addAll(this.printList); 199 | // } 200 | // } 201 | // } 202 | 203 | 204 | @Override 205 | protected void onCreate(Bundle savedInstanceState) { 206 | super.onCreate(savedInstanceState); 207 | setContentView(R.layout.activity_main); 208 | 209 | btn = findViewById(R.id.button); 210 | image1 = findViewById(R.id.image1); 211 | image2 = findViewById(R.id.image2); 212 | 213 | btn.setOnClickListener(new View.OnClickListener() { 214 | @Override 215 | public void onClick(View v) { 216 | //Bitmap bitmap = Bitmap.createBitmap(384, 384, Bitmap.Config.RGB_565); 217 | Bitmap bitmap = ((BitmapDrawable)image1.getDrawable()).getBitmap(); 218 | 219 | Log.i(TAG, "Bitmap created"); 220 | // printDataUtils.printArray(bitmap, false); 221 | // pm.printArray(bArr, true); 222 | 223 | Log.i(TAG, "Image width: " + bitmap.getWidth()); 224 | Log.i(TAG, "Image height: " + bitmap.getHeight()); 225 | 226 | Log.i(TAG, "Model name: " + model.getModelName()); 227 | Log.i(TAG, "Model no: " + model.getModelNo()); 228 | 229 | Log.i(TAG, "Print size: " + model.getPrintSize()); 230 | Log.i(TAG, "Devapi: " + model.getDevdpi()); 231 | Log.i(TAG, "Image MTU: " + model.getImgMTU()); 232 | Log.i(TAG, "Image Print Speed: " + model.getImgPrintSpeed()); 233 | Log.i(TAG, "Interval: " + model.getInterval()); 234 | Log.i(TAG, "Moderation Eneragy: " + model.getModerationEneragy()); 235 | Log.i(TAG, "One Length: " + model.getOneLength()); 236 | Log.i(TAG, "Size: " + model.getSize()); 237 | 238 | Log.i(TAG, "Paper Num: " + model.getPaperNum()); 239 | Log.i(TAG, "Paper Size: " + model.getPaperSize()); 240 | 241 | bitmap = imageDisposeUtil.fitBitmap(bitmap, model.getPaperSize(), true, true); 242 | 243 | if (bitmap.getWidth() < model.getPrintSize()) { 244 | bitmap = imageDisposeUtil.mergeBitmap(bitmap); 245 | } 246 | 247 | Log.i(TAG, "Button onClick: bitmap created"); 248 | image2.setImageBitmap(bitmap); 249 | 250 | PrintBean printBean = new PrintBean(); 251 | printBean.setPrintType(PrintDataUtils.IMG_PRINT_TYPE); 252 | //printBean.setShow(true); 253 | printBean.setBitmap(bitmap); 254 | printBean.setIstext(false); 255 | //printBean.setCrop(true); 256 | 257 | ArrayList arrayList = new ArrayList<>(); 258 | arrayList.add(printBean); 259 | 260 | printDataUtils.BitmapToData(arrayList, bitmap.getWidth(), 3, true); 261 | } 262 | }); 263 | } 264 | } -------------------------------------------------------------------------------- /BitmapTest/app/src/main/java/com/example/bitmaptest/PrintBean.java: -------------------------------------------------------------------------------- 1 | package com.example.bitmaptest; 2 | 3 | import android.graphics.Bitmap; 4 | import java.io.Serializable; 5 | 6 | 7 | public class PrintBean implements Serializable { 8 | private String HtmlContent; 9 | private boolean addWhite = false; 10 | private Bitmap bitmap; 11 | private boolean canText; 12 | private boolean crop; 13 | private boolean istext; 14 | private int printType; 15 | private boolean show = true; 16 | private String tag; 17 | private String title; 18 | private int type = 0; 19 | 20 | public boolean isAddWhite() { 21 | return this.addWhite; 22 | } 23 | 24 | public void setAddWhite(boolean z) { 25 | this.addWhite = z; 26 | } 27 | 28 | public boolean isCanText() { 29 | return this.canText; 30 | } 31 | 32 | public void setCanText(boolean z) { 33 | this.canText = z; 34 | } 35 | 36 | public String getTitle() { 37 | return this.title; 38 | } 39 | 40 | public void setTitle(String str) { 41 | this.title = str; 42 | } 43 | 44 | public int getType() { 45 | return this.type; 46 | } 47 | 48 | public void setType(int i) { 49 | this.type = i; 50 | } 51 | 52 | public int getPrintType() { 53 | return this.printType; 54 | } 55 | 56 | public void setPrintType(int i) { 57 | this.printType = i; 58 | } 59 | 60 | public String getHtmlContent() { 61 | return this.HtmlContent; 62 | } 63 | 64 | public void setHtmlContent(String str) { 65 | this.HtmlContent = str; 66 | } 67 | 68 | public boolean isCrop() { 69 | return this.crop; 70 | } 71 | 72 | public void setCrop(boolean z) { 73 | this.crop = z; 74 | } 75 | 76 | public boolean isIstext() { 77 | return this.istext; 78 | } 79 | 80 | public void setIstext(boolean z) { 81 | this.istext = z; 82 | } 83 | 84 | public String getTag() { 85 | return this.tag; 86 | } 87 | 88 | public void setTag(String str) { 89 | this.tag = str; 90 | } 91 | 92 | public Bitmap getBitmap() { 93 | return this.bitmap; 94 | } 95 | 96 | public void setBitmap(Bitmap bitmap2) { 97 | this.bitmap = bitmap2; 98 | } 99 | 100 | public boolean isShow() { 101 | return this.show; 102 | } 103 | 104 | public void setShow(boolean z) { 105 | this.show = z; 106 | } 107 | } 108 | 109 | -------------------------------------------------------------------------------- /BitmapTest/app/src/main/java/com/example/bitmaptest/PrintDataUtils.java: -------------------------------------------------------------------------------- 1 | package com.example.bitmaptest; 2 | 3 | import android.graphics.Bitmap; 4 | import android.util.Log; 5 | 6 | import java.util.ArrayList; 7 | import java.util.Arrays; 8 | import java.util.Iterator; 9 | import java.util.Vector; 10 | 11 | 12 | public class PrintDataUtils { 13 | private static PrintDataUtils mSingleInstance; 14 | private static int[] p0 = {0, 128}; 15 | private static int[] p1 = {0, 64}; 16 | private static int[] p2 = {0, 32}; 17 | private static int[] p3 = {0, 16}; 18 | private static int[] p4 = {0, 8}; 19 | private static int[] p5 = {0, 4}; 20 | private static int[] p6 = {0, 2}; 21 | private int ImgSpeed = 0; 22 | private int concentration = 0; 23 | private ArrayList dataIdentify; 24 | private int eneragy = 0; 25 | private ArrayList eneragyList; 26 | private boolean newCompress = true; 27 | private int packageLength = 0; 28 | private int textSpeed = 0; 29 | 30 | public static int TEXT_PRINT_TYPE = 0; 31 | public static int IMG_PRINT_TYPE = 1; 32 | 33 | private final PrinterModel pm = new PrinterModel(); 34 | final PrinterModel.DataBean model = pm.getModel("no"); 35 | 36 | public void printArray(byte[] bArr, boolean printAsHex){ 37 | int chunk = 50; // chunk size to divide 38 | for(int i = 0; i < bArr.length; i += chunk){ 39 | if (printAsHex) { 40 | Log.i("PrintDataUtils", BitmapHelpers.printHex(Arrays.copyOfRange(bArr, i, Math.min(bArr.length, i + chunk)))); 41 | } else { 42 | Log.i("PrintDataUtils", Arrays.toString(Arrays.copyOfRange(bArr, i, Math.min(bArr.length, i + chunk)))); 43 | } 44 | } 45 | } 46 | 47 | public static PrintDataUtils getInstance() { 48 | if (mSingleInstance == null) { 49 | synchronized (PrintDataUtils.class) { 50 | if (mSingleInstance == null) { 51 | mSingleInstance = new PrintDataUtils(); 52 | } 53 | } 54 | } 55 | return mSingleInstance; 56 | } 57 | 58 | public int getTextSpeed() { 59 | return this.textSpeed; 60 | } 61 | 62 | public void setTextSpeed(int i) { 63 | this.textSpeed = i; 64 | } 65 | 66 | public int getImgSpeed() { 67 | return this.ImgSpeed; 68 | } 69 | 70 | public int getEneragy() { 71 | if (this.eneragy != 0 || this.concentration == 0) { 72 | return this.eneragy; 73 | } 74 | return model.getEneragy(this.concentration); 75 | } 76 | 77 | public void setEneragy(int i) { 78 | if (i != 0 || this.concentration == 0) { 79 | this.eneragy = i; 80 | } else { 81 | this.eneragy = model.getEneragy(this.concentration); 82 | } 83 | } 84 | 85 | public ArrayList getEneragyList() { 86 | return this.eneragyList; 87 | } 88 | 89 | public void setEneragyList(ArrayList arrayList) { 90 | this.eneragyList = arrayList; 91 | } 92 | 93 | public void setImgSpeed(int i) { 94 | this.ImgSpeed = i; 95 | } 96 | 97 | // BitmapToData(list, AppApplication.getPrintImgSize(), printNum, concentrationType, flag); 98 | public void BitmapToData(final ArrayList imageToPrint, int width, int concentration, boolean flag) { 99 | Log.i("PrintDataUtils", "concentration---" + this.concentration); 100 | 101 | this.concentration = concentration; 102 | this.newCompress = flag; 103 | this.dataIdentify = new ArrayList<>(); 104 | 105 | ArrayList array_list = new ArrayList(); 106 | Vector vector = new Vector(imageToPrint); 107 | 108 | this.packageLength = BluetoothOrder.printLattice.length + 9; 109 | Log.i("PrintDataUtils", "packageLength: " + this.packageLength); 110 | 111 | // int newEneragy = pm.getCustomEnergy(model.getModelNo()).get((printNum - 1) * 2); 112 | // Log.i("PrintDataUtils", "ONE: " + newEneragy); 113 | // PrintDataUtils.this.setEneragy(newEneragy); 114 | 115 | int newEneragy = model.getEneragy(this.concentration); 116 | Log.i("PrintDataUtils", "set custom energy: " + newEneragy); 117 | this.setEneragy(newEneragy); // 12000 118 | 119 | int i2 = 0; 120 | for (int i3 = 0; i3 < vector.size(); i3++) { 121 | PrintBean printBean = (PrintBean)vector.get(i3); 122 | if (printBean.isShow() && printBean.getBitmap() != null) { 123 | byte[] bitmapToBWPix = bitmapToBWPix(printBean.getBitmap()); 124 | 125 | if (this.eneragyList != null && this.eneragyList.size() > 0) { 126 | this.setEneragy(this.eneragyList.get(i3)); 127 | } 128 | byte[] eachLinePixToCmdB = eachLinePixToCmdB(bitmapToBWPix, width, printBean.getPrintType()); 129 | 130 | // int chunk = 50; 131 | // for(int i = 0; i < eachLinePixToCmdB.length; i += chunk){ 132 | // Log.i("eachLinePixToCmdB", String.valueOf(Arrays.copyOfRange(eachLinePixToCmdB, i, Math.min(eachLinePixToCmdB.length, i + chunk)))); 133 | // } 134 | 135 | if (printBean.isAddWhite()) { 136 | i2 += BluetoothOrder.paper.length; 137 | array_list.add(BluetoothOrder.paper); 138 | } 139 | i2 += eachLinePixToCmdB.length; 140 | array_list.add(eachLinePixToCmdB); 141 | } 142 | } 143 | 144 | if (this.eneragyList != null) { 145 | this.eneragyList.clear(); 146 | } 147 | 148 | this.setEneragy(0); 149 | byte[] bArr = new byte[(((i2 + (BluetoothOrder.paper.length * 2) + 9)) + 9 + (BluetoothOrder.paper.length * (model.getPaperNum() - 2)) + BluetoothOrder.printLattice.length + BluetoothOrder.finishLattice.length + 9 + (BluetoothOrder.getDevState.length * 2))]; 150 | 151 | Log.i("PrintDataUtils", "Create tmp array with length = " + bArr.length); 152 | 153 | System.arraycopy(BluetoothOrder.getDevState, 0, bArr, 0, BluetoothOrder.getDevState.length); 154 | int length = BluetoothOrder.getDevState.length; 155 | 156 | Log.i("PrintDataUtils", "Copy getDevState to tmp arr, length = " + length); 157 | 158 | byte[] blackening = BluetoothOrder.getBlackening(concentration, model); 159 | System.arraycopy(blackening, 0, bArr, length, blackening.length); 160 | length = length + blackening.length; 161 | 162 | Log.i("PrintDataUtils", "Copy blackening to tmp arr, length = " + length); 163 | 164 | System.arraycopy(BluetoothOrder.printLattice, 0, bArr, length, BluetoothOrder.printLattice.length); 165 | length = length + BluetoothOrder.printLattice.length; 166 | 167 | Log.i("PrintDataUtils", "Copy printLattice to tmp arr, length = " + length); 168 | 169 | for (int i4 = 0; i4 < 1; i4++) { 170 | Iterator it = array_list.iterator(); 171 | while (it.hasNext()) { 172 | byte[] bArr2 = (byte[]) it.next(); 173 | System.arraycopy(bArr2, 0, bArr, length, bArr2.length); 174 | length += bArr2.length; 175 | } 176 | 177 | byte[] feedPaper = PrintDataUtils.this.feedPaper(25); 178 | System.arraycopy(feedPaper, 0, bArr, length, feedPaper.length); 179 | 180 | Log.i("PrintDataUtils", "Copy feedPaper to tmp arr, length = " + length); 181 | 182 | int length4 = length + feedPaper.length; 183 | 184 | if (model.getDevdpi() == 200) { 185 | System.arraycopy(BluetoothOrder.paper, 0, bArr, length4, BluetoothOrder.paper.length); 186 | } else if (model.getDevdpi() == 300) { 187 | System.arraycopy(BluetoothOrder.paper_300dpi, 0, bArr, length4, BluetoothOrder.paper_300dpi.length); 188 | } else { 189 | System.arraycopy(BluetoothOrder.paper, 0, bArr, length4, BluetoothOrder.paper.length); 190 | } 191 | int length5 = length4 + BluetoothOrder.paper.length; 192 | if (model.getDevdpi() == 200) { 193 | System.arraycopy(BluetoothOrder.paper, 0, bArr, length5, BluetoothOrder.paper.length); 194 | } else if (model.getDevdpi() == 300) { 195 | System.arraycopy(BluetoothOrder.paper_300dpi, 0, bArr, length5, BluetoothOrder.paper_300dpi.length); 196 | } else { 197 | System.arraycopy(BluetoothOrder.paper, 0, bArr, length5, BluetoothOrder.paper.length); 198 | } 199 | length = length5 + BluetoothOrder.paper.length; 200 | } 201 | 202 | byte[] feedPaper2 = PrintDataUtils.this.feedPaper(25); 203 | System.arraycopy(feedPaper2, 0, bArr, length, feedPaper2.length); 204 | 205 | length = length + feedPaper2.length; 206 | for (int i5 = 0; i5 < model.getPaperNum() - 2; i5++) { 207 | if (model.getDevdpi() == 200) { 208 | System.arraycopy(BluetoothOrder.paper, 0, bArr, length, BluetoothOrder.paper.length); 209 | } else if (model.getDevdpi() == 300) { 210 | System.arraycopy(BluetoothOrder.paper_300dpi, 0, bArr, length, BluetoothOrder.paper_300dpi.length); 211 | } else { 212 | System.arraycopy(BluetoothOrder.paper, 0, bArr, length, BluetoothOrder.paper.length); 213 | } 214 | length += BluetoothOrder.paper.length; 215 | } 216 | System.arraycopy(BluetoothOrder.finishLattice, 0, bArr, length, BluetoothOrder.finishLattice.length); 217 | System.arraycopy(BluetoothOrder.getDevState, 0, bArr, length + BluetoothOrder.finishLattice.length, BluetoothOrder.getDevState.length); 218 | // EventBusUtils.getInstance().post(Code.STARTPRINT, bArr); 219 | 220 | Log.i("PrintDataUtils", "Array length: " + bArr.length); 221 | Log.i("PrintDataUtils", "Result array:"); 222 | 223 | printArray(bArr, true); 224 | } 225 | 226 | public static byte[] bitmapToBWPix(Bitmap bitmap) { 227 | // It gets bitmap, copy all the pixels to int array and 228 | int width = bitmap.getWidth(); 229 | int height = bitmap.getHeight(); 230 | int bitmap_size = width * height; 231 | 232 | int[] iArr = new int[bitmap_size]; 233 | byte[] bArr = new byte[bitmap_size]; 234 | bitmap.getPixels(iArr, 0, width, 0, 0, width, height); 235 | format_K_threshold(iArr, bitmap.getWidth(), bitmap.getHeight(), bArr); 236 | return bArr; 237 | } 238 | 239 | public static void format_K_threshold(int[] iArr, int width, int height, byte[] bArr) { 240 | int row_n = 0; 241 | int blu_ish = 0; 242 | int pixel_idx = 0; 243 | while (row_n < height) { 244 | for (int i8 = 0; i8 < width; i8++) { 245 | blu_ish += iArr[pixel_idx] & 255; 246 | pixel_idx++; 247 | } 248 | row_n++; 249 | } 250 | int avg_bluish = ((blu_ish / height) / width) - 13; 251 | row_n = 0; 252 | int pix_idx = 0; 253 | while (row_n < height) { 254 | for (int i13 = 0; i13 < width; i13++) { 255 | int pix_bluish = iArr[pix_idx] & 255; 256 | if (pix_bluish == 0) { 257 | bArr[pix_idx] = 1; 258 | } else if (pix_bluish > avg_bluish) { 259 | bArr[pix_idx] = 0; 260 | } else { 261 | bArr[pix_idx] = 1; 262 | } 263 | pix_idx++; 264 | } 265 | row_n++; 266 | } 267 | } 268 | 269 | // {0, 0, 0, .... }, 384, 1, 270 | private byte[] eachLinePixToCmdB(byte[] bArr, int width, int printType) { 271 | String TAG = "eachLinePixToCmdB"; 272 | // String logString = "Input array: "; 273 | // Log.i(TAG, logString); 274 | // for(int i = 0; i < bArr.length; i += 50){ 275 | // byte[] tb = Arrays.copyOfRange(bArr, i, Math.min(bArr.length, i + 50)); 276 | // logString = "" + Arrays.toString(tb); 277 | // Log.i(TAG, logString); 278 | // } 279 | 280 | String logString = "Input array's width: " + width + ", print type: " + printType; 281 | Log.i(TAG, logString); 282 | 283 | byte[] tmpArr; 284 | 285 | byte[] bArr3; 286 | int i3; 287 | boolean z; 288 | int i4; 289 | byte b; 290 | char c; 291 | //int i5; 292 | //int i6; 293 | int length = bArr.length / width; 294 | int i7 = width / 8; 295 | ArrayList arrayList = new ArrayList(); 296 | ArrayList arrayList2 = new ArrayList(); 297 | new ArrayList(); 298 | int offset = 0; 299 | int eneragy = getEneragy(); 300 | 301 | Log.i(TAG, "eneragy: " + eneragy); 302 | 303 | if (eneragy != 0) { 304 | tmpArr = new byte[((width * length) + BluetoothOrder.print_text.length + 9 + 10)]; 305 | byte[] bArr4 = new byte[10]; 306 | bArr4[0] = 81; 307 | bArr4[1] = 120; 308 | bArr4[2] = -81; 309 | bArr4[3] = 0; 310 | bArr4[4] = 2; 311 | bArr4[5] = 0; 312 | bArr4[6] = hexString2Bytes(Integer.toHexString(eneragy))[1]; 313 | bArr4[7] = hexString2Bytes(Integer.toHexString(eneragy))[0]; 314 | bArr4[8] = BluetoothOrder.calcCrc8(bArr4, 6, 2); 315 | bArr4[9] = -1; 316 | 317 | System.arraycopy(bArr4, 0, tmpArr, 0, bArr4.length); 318 | this.packageLength += 10; 319 | offset = 10; 320 | 321 | logString = "New 10 bytes: " + Arrays.toString(tmpArr) 322 | .concat("package length: " + this.packageLength); 323 | Log.i(TAG, logString); 324 | 325 | } else { 326 | tmpArr = new byte[((width * length) + BluetoothOrder.print_text.length + 9)]; 327 | 328 | logString = "No new bytes: " + Arrays.toString(tmpArr) 329 | .concat("package length: " + this.packageLength); 330 | Log.i(TAG, logString); 331 | } 332 | 333 | if (printType == TEXT_PRINT_TYPE) { 334 | System.arraycopy(BluetoothOrder.print_text, 0, tmpArr, offset, BluetoothOrder.print_text.length); 335 | 336 | Log.i(TAG, "[TEXT PRINT TYPE] Copy print_text to tmpArr: " + Arrays.toString(BluetoothOrder.print_text)); 337 | 338 | offset += BluetoothOrder.print_text.length; 339 | this.packageLength += BluetoothOrder.print_text.length; 340 | 341 | int textSpeed = getTextSpeed(); 342 | if (textSpeed == 0) { 343 | textSpeed = model.getTextPrintSpeed(); 344 | } 345 | 346 | Log.i(TAG, "textSpeed-----" + textSpeed); 347 | 348 | byte[] feedPaper = feedPaper(textSpeed); 349 | System.arraycopy(feedPaper, 0, tmpArr, offset, feedPaper.length); 350 | 351 | Log.i(TAG, "[TEXT PRINT TYPE] Copy feedPaper(textSpeed) to tmpArr: " + Arrays.toString(feedPaper)); 352 | 353 | } else if (printType == IMG_PRINT_TYPE) { 354 | System.arraycopy(BluetoothOrder.print_img, 0, tmpArr, offset, BluetoothOrder.print_img.length); 355 | offset += BluetoothOrder.print_img.length; 356 | 357 | Log.i(TAG, "[IMG PRINT TYPE] Copy print_img to tmpArr: " + Arrays.toString(BluetoothOrder.print_img)); 358 | 359 | this.packageLength += BluetoothOrder.print_img.length; 360 | 361 | int imgSpeed = getImgSpeed(); 362 | if (imgSpeed == 0) { 363 | imgSpeed = model.getImgPrintSpeed(); 364 | } 365 | 366 | Log.e("eachLinePixToCmdB", "imgSpeed-----" + imgSpeed); 367 | 368 | byte[] feedPaper = feedPaper(imgSpeed); 369 | System.arraycopy(feedPaper, 0, tmpArr, offset, feedPaper.length); 370 | 371 | Log.i(TAG, "[IMG PRINT TYPE] Copy feedPaper(imgSpeed) to tmpArr: " + Arrays.toString(feedPaper)); 372 | } 373 | 374 | 375 | Log.i(TAG, "Some strange shit starting..."); 376 | int i9 = offset + 9; 377 | 378 | this.packageLength += 9; 379 | 380 | int i10 = 0; 381 | int i11 = 0; 382 | int i12 = 0; 383 | while (i10 < length) { 384 | i11 += 8; 385 | arrayList.clear(); 386 | arrayList2.clear(); 387 | if (this.newCompress) { 388 | int i13 = 0; 389 | b = 0; 390 | i4 = 0; 391 | z = false; 392 | while (true) { 393 | if (i13 >= width) { 394 | i3 = length; 395 | break; 396 | } 397 | byte b2 = bArr[i12 + i13]; 398 | if (i13 == 0 || b == b2) { 399 | i4++; 400 | } else { 401 | dataTrim(i4, b, arrayList2); 402 | i4 = 1; 403 | } 404 | if (b2 == 0 || z) { 405 | i3 = length; 406 | } else { 407 | i3 = length; 408 | z = true; 409 | } 410 | if (arrayList2.size() > i7) { 411 | break; 412 | } 413 | if (i13 == width - 1 && i4 != 0 && z) { 414 | dataTrim(i4, b2, arrayList2); 415 | i4 = 0; 416 | } 417 | i13++; 418 | b = b2; 419 | length = i3; 420 | } 421 | } else { 422 | i3 = length; 423 | b = 0; 424 | i4 = 0; 425 | z = false; 426 | } 427 | i12 += width; 428 | if (arrayList2.size() > i7 || !this.newCompress) { 429 | arrayList.clear(); 430 | i12 -= width; 431 | arrayList.add((byte) -1); 432 | for (int i14 = 0; i14 < i7; i14++) { 433 | i12 += 8; 434 | arrayList.add((byte) (p0[bArr[i12 + 7]] + p1[bArr[i12 + 6]] + p2[bArr[i12 + 5]] + p3[bArr[i12 + 4]] + p4[bArr[i12 + 3]] + p5[bArr[i12 + 2]] + p6[bArr[i12 + 1]] + bArr[i12])); 435 | } 436 | } else { 437 | arrayList.addAll(arrayList2); 438 | } 439 | if (!z && arrayList.size() == 0) { 440 | dataTrim(i4, b, arrayList); 441 | } 442 | if (arrayList.size() > 0) { 443 | byte[] bArr5 = new byte[arrayList.size()]; 444 | for (int i15 = 0; i15 < arrayList.size(); i15++) { 445 | bArr5[i15] = ((Byte) arrayList.get(i15)).byteValue(); 446 | } 447 | i11 += arrayList.size(); 448 | String hexString = Integer.toHexString(bArr5.length); 449 | tmpArr[i9] = 81; 450 | tmpArr[i9 + 1] = 120; 451 | if (bArr5[0] == -1 && bArr5.length == i7 + 1) { 452 | tmpArr[i9 + 2] = -94; 453 | i11--; 454 | hexString = Integer.toHexString(i7); 455 | } else { 456 | tmpArr[i9 + 2] = -65; 457 | } 458 | tmpArr[i9 + 3] = 0; 459 | tmpArr[i9 + 4] = hexString2Bytes(hexString)[0]; 460 | tmpArr[i9 + 5] = 0; 461 | if (bArr5[0] == -1 && bArr5.length == i7 + 1) { 462 | System.arraycopy(bArr5, 1, tmpArr, i9 + 6, bArr5.length - 1); 463 | c = 0; 464 | } else { 465 | c = 0; 466 | System.arraycopy(bArr5, 0, tmpArr, i9 + 6, bArr5.length); 467 | } 468 | if (bArr5[c] == -1 && bArr5.length == i7 + 1) { 469 | int i16 = i9 + 6; 470 | tmpArr[i16 + i7] = BluetoothOrder.calcCrc8(tmpArr, i16, i7); 471 | tmpArr[i9 + 7 + i7] = -1; 472 | i9 = i9 + 8 + i7; 473 | this.packageLength = this.packageLength + 8 + i7; 474 | } else { 475 | int i17 = i9 + 6; 476 | tmpArr[bArr5.length + i17] = BluetoothOrder.calcCrc8(tmpArr, i17, bArr5.length); 477 | tmpArr[i9 + 7 + bArr5.length] = -1; 478 | i9 = i9 + 8 + bArr5.length; 479 | this.packageLength = this.packageLength + 8 + bArr5.length; 480 | } 481 | } 482 | i10++; 483 | length = i3; 484 | } 485 | 486 | if (getEneragy() != 0) { 487 | bArr3 = new byte[(i11 + BluetoothOrder.print_text.length + 19)]; 488 | } else { 489 | bArr3 = new byte[(i11 + BluetoothOrder.print_text.length + 9)]; 490 | } 491 | System.arraycopy(tmpArr, 0, bArr3, 0, bArr3.length); 492 | 493 | // Log.i(TAG, Arrays.toString(bArr3)); 494 | 495 | // int chunk = 50; // chunk size to divide 496 | // for(int i = 0; i < bArr.length; i += chunk){ 497 | // Log.i(TAG, Arrays.toString(Arrays.copyOfRange(bArr3, i, Math.min(bArr.length, i + chunk)))); 498 | // } 499 | 500 | return bArr3; 501 | } 502 | 503 | public static byte[] conver2HexToByte(String str) { 504 | String[] split = str.split(","); 505 | byte[] bArr = new byte[split.length]; 506 | for (int i = 0; i < bArr.length; i++) { 507 | bArr[i] = Long.valueOf(split[i], 2).byteValue(); 508 | } 509 | return bArr; 510 | } 511 | 512 | private static String toBinary(int i) { 513 | String str = ""; 514 | while (i != 0) { 515 | str = (i % 2) + str; 516 | i /= 2; 517 | } 518 | return str; 519 | } 520 | 521 | private byte[] eachLinePixToCmdC(byte[] bArr, int i) { 522 | int i2; 523 | int length = bArr.length / i; 524 | int i3 = i / 8; 525 | int i4 = i3 + 8; 526 | byte[] bArr2 = new byte[((length * i4) + BluetoothOrder.print_text.length + 9)]; 527 | System.arraycopy(BluetoothOrder.print_text, 0, bArr2, 0, BluetoothOrder.print_text.length); 528 | int length2 = BluetoothOrder.print_text.length; 529 | if (getImgSpeed() == 0) { 530 | i2 = model.getTextPrintSpeed(); 531 | } else { 532 | i2 = getTextSpeed(); 533 | } 534 | byte[] feedPaper = feedPaper(i2); 535 | System.arraycopy(feedPaper, 0, bArr2, length2, feedPaper.length); 536 | String hexString = Integer.toHexString(i3); 537 | int i5 = 0; 538 | int i6 = 0; 539 | while (i5 < length) { 540 | int length3 = (i5 * i4) + BluetoothOrder.print_text.length + 9; 541 | bArr2[length3 + 0] = 81; 542 | bArr2[length3 + 1] = 120; 543 | bArr2[length3 + 2] = -94; 544 | bArr2[length3 + 3] = 0; 545 | bArr2[length3 + 4] = hexString2Bytes(hexString)[0]; 546 | bArr2[length3 + 5] = 0; 547 | int i7 = i6; 548 | for (int i8 = 0; i8 < i3; i8++) { 549 | bArr2[length3 + 6 + i8] = (byte) (p0[bArr[i7 + 7]] + p1[bArr[i7 + 6]] + p2[bArr[i7 + 5]] + p3[bArr[i7 + 4]] + p4[bArr[i7 + 3]] + p5[bArr[i7 + 2]] + p6[bArr[i7 + 1]] + bArr[i7 + 0]); 550 | i7 += 8; 551 | } 552 | int i9 = length3 + 6; 553 | bArr2[i9 + i3] = BluetoothOrder.calcCrc8(bArr2, i9, i3); 554 | bArr2[length3 + 7 + i3] = -1; 555 | i5++; 556 | i6 = i7; 557 | } 558 | return bArr2; 559 | } 560 | 561 | private static void dataTrim(int i, byte byte0, ArrayList arrayList) { 562 | for (; i > 127; i -= 127) { 563 | arrayList.add(conver2HexToByte(byte0 + toBinary(127))[0]); 564 | } 565 | 566 | if (i > 0) { 567 | String binary = toBinary(i); 568 | String str = ((int) byte0) + ""; 569 | if (binary.length() < 8) { 570 | String str2 = str; 571 | for (int i2 = 0; i2 < 7 - binary.length(); i2++) { 572 | str2 = str2 + 0; 573 | } 574 | str = str2; 575 | } 576 | arrayList.add(conver2HexToByte(str + binary)[0]); 577 | } 578 | } 579 | 580 | /* access modifiers changed from: private */ 581 | /* access modifiers changed from: public */ 582 | private byte[] feedPaper(int i) { 583 | byte[] bArr = new byte[9]; 584 | bArr[0] = 81; 585 | bArr[1] = 120; 586 | bArr[2] = -67; 587 | bArr[3] = 0; 588 | bArr[4] = 1; 589 | bArr[5] = 0; 590 | bArr[6] = hexString2Bytes(Integer.toHexString(i))[0]; 591 | bArr[7] = BluetoothOrder.calcCrc8(bArr, 6, 1); 592 | bArr[8] = -1; 593 | return bArr; 594 | } 595 | 596 | public byte[] filledByte() { 597 | int paperSize = this.model.getPaperSize(); 598 | 599 | byte[] bArr = new byte[(paperSize + (BluetoothOrder.paper.length * this.model.getPaperNum()))]; 600 | for (int i = 0; i < paperSize; i++) { 601 | bArr[i] = 0; 602 | } 603 | 604 | for (int i2 = 0; i2 < this.model.getPaperNum(); i2++) { 605 | if (this.model.getDevdpi() == 200) { 606 | System.arraycopy(BluetoothOrder.paper, 0, bArr, paperSize, BluetoothOrder.paper.length); 607 | } else if (this.model.getDevdpi() == 300) { 608 | System.arraycopy(BluetoothOrder.paper_300dpi, 0, bArr, paperSize, BluetoothOrder.paper_300dpi.length); 609 | } else { 610 | System.arraycopy(BluetoothOrder.paper, 0, bArr, paperSize, BluetoothOrder.paper.length); 611 | } 612 | paperSize += BluetoothOrder.paper.length; 613 | } 614 | return bArr; 615 | } 616 | 617 | public byte[] filledByte(byte[] bArr) { 618 | int printSize = this.model.getPrintSize(); 619 | 620 | byte[] bArr2 = new byte[printSize]; 621 | System.arraycopy(bArr, 0, bArr2, 0, bArr.length); 622 | int length = bArr.length; 623 | for (int i = 0; i < printSize - length; i++) { 624 | bArr2[length + i] = 0; 625 | } 626 | return bArr2; 627 | } 628 | 629 | public static int hex2Dec(char c) { 630 | if (c >= '0' && c <= '9') { 631 | return c - 48; 632 | } 633 | if (c >= 'A' && c <= 'F') { 634 | return (c - 65) + 10; 635 | } 636 | return -1; 637 | } 638 | 639 | public static byte[] hexString2Bytes(String s) { 640 | int i = 0; 641 | int str_len = s.length(); 642 | int k = str_len; 643 | Object obj = s; 644 | if (str_len % 2 != 0) { 645 | obj = new StringBuilder(); 646 | ((StringBuilder) (obj)).append("0"); 647 | ((StringBuilder) (obj)).append(s); 648 | obj = ((StringBuilder) (obj)).toString(); 649 | k = str_len + 1; 650 | } 651 | char[] ac = ((String) (obj)).toUpperCase().toCharArray(); 652 | byte[] my_s = new byte[k >> 1]; 653 | for (; i < k; i += 2) 654 | my_s[i >> 1] = (byte) (hex2Dec(ac[i]) << 4 | hex2Dec(ac[i + 1])); 655 | return my_s; 656 | } 657 | } 658 | -------------------------------------------------------------------------------- /BitmapTest/app/src/main/java/com/example/bitmaptest/PrinterModel.java: -------------------------------------------------------------------------------- 1 | package com.example.bitmaptest; 2 | 3 | import java.lang.reflect.Field; 4 | import java.util.ArrayList; 5 | 6 | public class PrinterModel { 7 | public String deviceName = "GT01"; 8 | 9 | public DataBean getModel(String flag) { 10 | if("jingzhunxuexi_wand".equals(flag)) { 11 | return new DataBean("GT01", " ", 0, 2, 384, 384, 8, "GT01-", true, 200, 55, 45, 123, 83, true, 2, 4, false, 12000, 12000, 12000, true); 12 | } 13 | return new DataBean("GT01", " ", 0, 2, 384, 384, 8, "GT01-", true, 200, 30, 25, 123, 83, true, 2, 4, false, 12000, 12000, 12000, true); 14 | } 15 | 16 | public class DataBean { 17 | private boolean canChangeMTU; 18 | private int deepenEneragy; 19 | private int devdpi; 20 | private boolean hasId; 21 | private String headName; 22 | private int imgMTU; 23 | private int imgPrintSpeed; 24 | private int interval; 25 | private int model; 26 | private String modelName; 27 | private String modelNo; 28 | private int moderationEneragy; 29 | private boolean newCompress; 30 | private int oneLength; 31 | private int paperNum; 32 | private int paperSize; 33 | private int printSize; 34 | private int size; 35 | private int textMTU; 36 | private int textPrintSpeed; 37 | private int thinEneragy; 38 | private boolean useSPP; 39 | 40 | public DataBean(String str, String str2, int i, int i2, int i3, int i4, int i5, 41 | String str3, boolean z, int i6, int i7, int i8, int i9, int i10, boolean z2, 42 | int i11, int i12, boolean z3, int i13, int i14, int i15, boolean z4) { 43 | this.modelNo = str; 44 | this.modelName = str2; 45 | this.model = i; 46 | this.size = i2; 47 | this.paperSize = i3; 48 | this.printSize = i4; 49 | this.oneLength = i5; 50 | this.headName = str3; 51 | this.canChangeMTU = z; 52 | this.devdpi = i6; 53 | this.imgPrintSpeed = i7; 54 | this.textPrintSpeed = i8; 55 | this.imgMTU = i9; 56 | this.textMTU = i10; 57 | this.newCompress = z2; 58 | this.paperNum = i11; 59 | this.interval = i12; 60 | this.useSPP = z3; 61 | this.thinEneragy = i13; 62 | this.moderationEneragy = i14; 63 | this.deepenEneragy = i15; 64 | this.hasId = z4; 65 | } 66 | 67 | public boolean isHasId() { 68 | return this.hasId; 69 | } 70 | public void setHasId(boolean z) { 71 | this.hasId = z; 72 | } 73 | public int getThinEneragy() { 74 | return this.thinEneragy; 75 | } 76 | public int getModerationEneragy() { 77 | return this.moderationEneragy; 78 | } 79 | public int getDeepenEneragy() { 80 | return this.deepenEneragy; 81 | } 82 | public int getEneragy(int i) { 83 | if (i == 2) { 84 | return getThinEneragy(); 85 | } 86 | if (i == 3) { 87 | return getModerationEneragy(); 88 | } 89 | if (i == 5) { 90 | return getDeepenEneragy(); 91 | } 92 | return getModerationEneragy(); 93 | } 94 | public int getInterval() { 95 | return this.interval; 96 | } 97 | public int getImgMTU() { 98 | return this.imgMTU; 99 | } 100 | public int getTextMTU() { 101 | return this.textMTU; 102 | } 103 | public void setTextMTU(int i) { 104 | this.textMTU = i; 105 | } 106 | public void setImgMTU(int i) { 107 | this.imgMTU = i; 108 | } 109 | public boolean isNewCompress() { 110 | return this.newCompress; 111 | } 112 | public boolean isUseSPP() { 113 | return this.useSPP; 114 | } 115 | public void setPaperNum(int i) { 116 | this.paperNum = i; 117 | } 118 | public int getPrintSize() { 119 | return this.printSize; 120 | } 121 | public void setPrintSize(int i) { 122 | this.printSize = i; 123 | } 124 | public int getPaperNum() { 125 | return this.paperNum; 126 | } 127 | public int getImgPrintSpeed() { 128 | return this.imgPrintSpeed; 129 | } 130 | public void setImgPrintSpeed(int i) { 131 | this.imgPrintSpeed = i; 132 | } 133 | public int getTextPrintSpeed() { 134 | return this.textPrintSpeed; 135 | } 136 | public void setTextPrintSpeed(int i) { 137 | this.textPrintSpeed = i; 138 | } 139 | public int getDevdpi() { 140 | return this.devdpi; 141 | } 142 | public void setDevdpi(int i) { 143 | this.devdpi = i; 144 | } 145 | public void setHeadName(String str) { 146 | this.headName = str; 147 | } 148 | public int getOneLength() { 149 | return this.oneLength; 150 | } 151 | public void setOneLength(int i) { 152 | this.oneLength = i; 153 | } 154 | public String getModelNo() { 155 | return this.modelNo; 156 | } 157 | public void setModelNo(String str) { 158 | this.modelNo = str; 159 | } 160 | public String getModelName() { 161 | return this.modelName; 162 | } 163 | public void setModelName(String str) { 164 | this.modelName = str; 165 | } 166 | public int getModel() { 167 | return this.model; 168 | } 169 | public void setModel(int i) { 170 | this.model = i; 171 | } 172 | public int getSize() { 173 | return this.size; 174 | } 175 | public void setSize(int i) { 176 | this.size = i; 177 | } 178 | public int getPaperSize() { 179 | return this.paperSize; 180 | } 181 | public void setPaperSize(int i) { 182 | this.paperSize = i; 183 | } 184 | public boolean isCanChangeMTU() { 185 | return this.canChangeMTU; 186 | } 187 | public void setCanChangeMTU(boolean z) { 188 | this.canChangeMTU = z; 189 | } 190 | 191 | @Override 192 | public String toString() { 193 | 194 | StringBuilder result = new StringBuilder(); 195 | String newLine = System.getProperty("line.separator"); 196 | 197 | result.append( this.getClass().getName() ); 198 | result.append( " Object {" ); 199 | result.append(newLine); 200 | 201 | //determine fields declared in this class only (no fields of superclass) 202 | Field[] fields = this.getClass().getDeclaredFields(); 203 | 204 | //print field names paired with their values 205 | for ( Field field : fields ) { 206 | result.append(" "); 207 | try { 208 | result.append( field.getName() ); 209 | result.append(": "); 210 | //requires access to private field: 211 | result.append( field.get(this) ); 212 | } catch ( IllegalAccessException ex ) { 213 | System.out.println(ex); 214 | } 215 | result.append(newLine); 216 | } 217 | result.append("}"); 218 | 219 | return result.toString(); 220 | } 221 | } 222 | 223 | public ArrayList getCustomEnergy(String flag) { 224 | // getCustomEnergy: [7680, 7680, 9600, 9600, 12000, 12000, 14400, 14400, 17280, 17280, 20000, 20000, 20000, 20000] 225 | int eneragy = getModel(flag).getEneragy(3); 226 | int i = (int) ((double) eneragy * 0.8d); 227 | int i2 = (int) (((double) i) * 0.8d); 228 | int i3 = (int) ((double) eneragy * 1.2d); 229 | int i4 = 20000; 230 | if (i3 > 20000) { 231 | i3 = 20000; 232 | } 233 | int i5 = (int) (((double) i3) * 1.2d); 234 | int i6 = (int) (((double) i5) * 1.2d); 235 | int i7 = (int) (((double) i6) * 1.2d); 236 | if (i5 > 20000) { 237 | i5 = 20000; 238 | } 239 | if (i6 > 20000) { 240 | i6 = 20000; 241 | } 242 | if (i7 <= 20000) { 243 | i4 = i7; 244 | } 245 | ArrayList arrayList = new ArrayList<>(); 246 | arrayList.add(i2); 247 | arrayList.add(i2); 248 | arrayList.add(i); 249 | arrayList.add(i); 250 | arrayList.add(eneragy); 251 | arrayList.add(eneragy); 252 | arrayList.add(i3); 253 | arrayList.add(i3); 254 | arrayList.add(i5); 255 | arrayList.add(i5); 256 | arrayList.add(i6); 257 | arrayList.add(i6); 258 | arrayList.add(i4); 259 | arrayList.add(i4); 260 | return arrayList; 261 | } 262 | } -------------------------------------------------------------------------------- /BitmapTest/app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /BitmapTest/app/src/main/res/drawable/anime_girl_car.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lisp3r/bluetooth-thermal-printer/f96df888173bd5bd9941a29427b67d7e92810463/BitmapTest/app/src/main/res/drawable/anime_girl_car.jpg -------------------------------------------------------------------------------- /BitmapTest/app/src/main/res/drawable/greyscale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lisp3r/bluetooth-thermal-printer/f96df888173bd5bd9941a29427b67d7e92810463/BitmapTest/app/src/main/res/drawable/greyscale.png -------------------------------------------------------------------------------- /BitmapTest/app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /BitmapTest/app/src/main/res/drawable/icon1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lisp3r/bluetooth-thermal-printer/f96df888173bd5bd9941a29427b67d7e92810463/BitmapTest/app/src/main/res/drawable/icon1.png -------------------------------------------------------------------------------- /BitmapTest/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 20 | 21 |