本文簡單介紹了Gprinter光柵點陣圖點陣數據解析工具及實現時的註意點。 ...
最近參與的項目有一個需求,解析佳博熱敏印表機的光柵點陣圖點陣數據並保存為圖片文件。數據是通過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工具比較,圖像並未有任何損失,如下圖所示。
本次任務基本完成並達到預期效果。第一次接觸熱敏印表機,算是有了一個初步的認識,後面有時間可以考慮把這個事情反過來做一遍,即把任意圖片文件轉換為光柵點陣圖點陣數據,這樣就可以列印二維碼或其他複雜圖像了。