最近參與的項目有一個需求,解析佳博熱敏打印機的光柵位圖點陣數據并保存為圖片文件。數據是通過Bus Hound抓取的,如下圖所示。
其中1b 40為初始化打印機的指令,對應的ASCII碼為ESC @,1b 4a 18為打印并走紙的指令,對應的ASCII碼為ESC J,1d 76 30為打印光柵位圖的指令,對應的ASCII碼為GS v 0,其后緊跟光柵位圖模式(0x00)、水平方向位圖字節數(0x0036)和垂直方向位圖點數(0x0018),后面則為本幀的位圖數據(0x36*0x18=1296字節)。數據文件后續以1b 4a 18的打印走紙幀和1d 76 30的位圖數據幀循環往復,直至打印內容結束。
數據解析是關鍵一環,同時還需要考慮光柵位圖點陣數據的無損壓縮并評估壓縮效率。為了直觀顯示解析后的圖像和相關信息,并保存成bmp和png格式的圖片,基于MFC寫了一個小工具,界面如下圖所示。
窗口左側白色區域顯示解析后的圖像,右側顯示原始數據的信息及生成的Zip包、Bitmap及PNG圖片的信息。為了方便調試,數據文件支持通過Bus Hound抓取的txt,原始的光柵位圖點陣數據,及其它們的zip壓縮包,只需將文件拖拽到窗口內部即可完成解析。生成Bitmap時,支持選擇掃描的方向,并可選擇生成原始數據的二進制文件(Plain Binary)、經過zip壓縮的原始數據的二進制文件以及剔除原始數據中ESC指令的純數據文件(Pure Data)。
解析點陣數據后的圖像及相關信息如下圖所示。
在將光柵位圖點陣數據保存為Bitmap時,需要特別注意,如果水平方向位圖字節數不是4的整倍數,則需要擴展到4的整倍數才可以。如本例中原始寬度為54字節,需擴展到56字節,擴展后的像素寬度為448(56*8)。另外,原始光柵位圖點陣數據是從上到下(Top-Down)排列的,如果生成Bitmap時選擇同向掃描,則BITMAPINFOHEADER結構體中biHeight需為負數,而一般的Bitmap文件為從下到上掃描(Bottom-Up),與原始數據排列方向剛好相反,此時biHeight為正。可以看到經過zip壓縮后的數據約為原有大小的1/5。PNG圖片大小也約為BMP的1/5,但通過Beyond Compare工具比較,圖像并未有任何損失,如下圖所示。
本次任務基本完成并達到預期效果。第一次接觸熱敏打印機,算是有了一個初步的認識,后面有時間可以考慮把這個事情反過來做一遍,即把任意圖片文件轉換為光柵位圖點陣數據,這樣就可以打印二維碼或其他復雜圖像了。
- PC官方版
- 安卓官方手機版
- IOS官方手機版