<div class="van-cell van-field"> <div class="van-cell__title van-field__label">頭像:</div> <div class="van-cell__value van-field__value"> <div class="va ...
PUTBMP命令只支持列印位深為1或8的bmp圖片。
Bitmap生成二維碼可以用ZXing.Net庫。
可參考 C# ZXing.Net生成二維碼、識別二維碼、生成帶Logo的二維碼(一) - 天馬3798 - 博客園 (cnblogs.com)
如果Bitmap.Save()方法生成的是24位深圖片,需要先做位數轉換。
可參考 彩色/灰色Bmp 轉單色 - johngeng - 博客園 (cnblogs.com)
通過上述轉換得到單色bmp圖片後,卻無法列印出二維碼;而用系統自帶的畫圖軟體另存為單色bmp圖,是可以列印的
BMP文件結構可參考 BMP圖像文件完全解析 - 知乎 (zhihu.com)
於是用UltraEdit打開兩種方式生成的單色bmp圖片做對比,發現由畫圖軟體生成的單色圖,信息頭部分biSizeImages(第35-38位元組)表示的是點陣圖數據的真實大小;而Bitmap.Save()方法生成的單色圖,biSizeImages存儲的是0x00000000,表示點陣圖數據大小為0。
顯然這就是錯誤所在,需要做以下步驟來重構bmp圖片。
private void RebuildBitmapFile(string fileName) { Bitmap bitmap = new Bitmap(fileName);
// 獲取原圖片文件大小 int sizeInByte = (int)new FileInfo(fileName).Length;
using (MemoryStream stream = new MemoryStream()) {
// 把bitmap保存到MemoryStream,再存儲為byte數組 bitmap.Save(stream, ImageFormat.Bmp); byte[] data = new byte[sizeInByte]; stream.Seek(0, SeekOrigin.Begin); stream.Read(data, 0, Convert.ToInt32(stream.Length));
// 把biSizeImages設置為真實大小。data[10]-data[13]表示bfOffBits,即從文件頭到點陣圖數據的偏移量 byte[] newInfo = intToBytes(sizeInByte - data[10] - data[11] * 256 - data[12] * 256 * 256 - data[13] * 256 * 256 * 256); data[34] = newInfo[0]; data[35] = newInfo[1]; data[36] = newInfo[2]; data[37] = newInfo[3];
// 保存並覆蓋原圖片。這裡不能用Bitmap.Save(),否則biSizeImages信息又是錯的 File.WriteAllBytes(fileName, data); } } public byte[] intToBytes(int value) { byte[] src = new byte[4]; src[3] = (byte)((value >> 24) & 0xFF); src[2] = (byte)((value >> 16) & 0xFF); src[1] = (byte)((value >> 8) & 0xFF); src[0] = (byte)(value & 0xFF); return src; }
重構之後二維碼圖片列印成功。