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