亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

熱敏打印單色位圖

2019-11-14 13:58:24
字體:
來源:轉載
供稿:網友

EPSON熱敏打印機通過POSDLL調用POS_PReDownloadBmpToRAM、POS_S_PrintBmpInRAM函數實現電影票等單色位圖的二維碼打印,而在轉換單色位圖后,需將圖像信息頭中的位圖點陣圖使用的調色板顏色數(10)及指定重要的顏色數(11)設置為0;同時,點陣圖資料大小為(7)為(2)。

  1. size:4 bytes,0x28 = 40 bytes,表示Info Header的大長度總共 40 bytes
  2. width:4 bytes,0x10 = 16,圖像寬度為16 pixel
  3. height:4 bytes,0x10 = 16,圖像高度為16 pixel
  4. planes:2 bytes,0x01 = 1,位元面數為1
  5. bits:2 bytes,0x20 = 32,每個pixel需要32bits
  6. compression:4 bytes,0代表不壓縮
  7. imagesize:4 bytes,0x400 = 1024 bytes,點陣圖資料大小為1024 bytes
  8. xresolution:4 bytes,水平解析度
  9. yresolution:4 bytes,垂直解析度
  10. ncolours:4 bytes,點陣圖使用的調色板顏色數
  11. importantcolours:4 bytes,重要的顏色數

圖片引用自《http://blog.csdn.net/o_sun_o/article/details/8351037》。

 

具體操作方法為:

/// <summary>
/// 生成二維碼代碼
/// </summary>
/// <param name="txt_qr">需要生成二維碼的信息</param>
/// <param name="txt_size">值越大生成的二維碼圖片像素越高</param>
/// <returns>二維碼圖片的信息</returns>
private static string generateQRCode(string txt_qr, string txt_size)
{
//生成二維碼
string filepath = string.Empty;
string qrEncoding = "Byte";
string Level = "M";
string txt_ver = "0";

QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
String encoding = qrEncoding;
if (encoding == "Byte")
{
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
}
else if (encoding == "AlphaNumeric")
{
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;
}
else if (encoding == "Numeric")
{
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC;
}

string errorCorrect = Level;
if (errorCorrect == "L")
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;
else if (errorCorrect == "M")
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
else if (errorCorrect == "Q")
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;
else if (errorCorrect == "H")
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;

try
{
int scale = Convert.ToInt16(txt_size);
qrCodeEncoder.QRCodeScale = scale;///大小(值越大生成的二維碼圖片像素越高)
int version = Convert.ToInt16(txt_ver);
qrCodeEncoder.QRCodeVersion = version;

String data = txt_qr;
Bitmap image = qrCodeEncoder.Encode(data);
int image_Width = image.Width;
int image_Height = image.Height;
Bitmap resizedBmp = new Bitmap(image_Width + 4, image_Height + 4);
Graphics g = Graphics.FromImage(resizedBmp);
g.Clear(Color.White);//用背景色刷新
// Create rectangle for displaying image.
Rectangle destRect = new Rectangle(2, 2, image_Width, image_Height);
// Create rectangle for source image.
Rectangle srcRect = new Rectangle(0, 0, image_Width, image_Height);
// Draw image to screen.
g.DrawImage((Image)image, destRect, srcRect, GraphicsUnit.Pixel); g.Dispose();
filepath = ConvertToBpp(resizedBmp);

resizedBmp.Dispose();
image.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "信息提示");
}
return filepath;
}

/// <summary>
/// 轉換單色位圖的方法
/// </summary>
/// <param name="img"></param>
private static Bitmap xxx(Bitmap img)
{
int w = img.Width;
int h = img.Height;
Bitmap bmp = new Bitmap(w, h, PixelFormat.Format1bppIndexed);

BitmapData data = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed);
for (int y = 0; y < h; y++)
{
byte[] scan = new byte[(w + 7) / 8];
for (int x = 0; x < w; x++)
{
Color c = img.GetPixel(x, y);
if (c.GetBrightness() >= 0.5) scan[x / 8] |= (byte)(0x80 >> (x % 8));
}
Marshal.Copy(scan, 0, (IntPtr)((int)data.Scan0 + data.Stride * y), scan.Length);
}
bmp.Palette = CreateGrayscalePalette();
return bmp;
}

/// 創建圖像格式對應的調色板
/// </summary>
/// <param name="pixelFormat">圖像格式,只能是Format1bppIndexed,Format1bppIndexed,Format1bppIndexed</param>
/// <returns>返回調色板;如果創建失敗或者圖像格式不支持,返回null。</returns>
private static ColorPalette CreateColorPalette(PixelFormat pixelFormat)
{
ColorPalette palette = null;
if (pixelFormat == PixelFormat.Format1bppIndexed || pixelFormat == PixelFormat.Format4bppIndexed || pixelFormat == PixelFormat.Format8bppIndexed)
{
//因為ColorPalette類沒有構造函數,所以這里創建一個1x1的位圖,然后抓取該位圖的調色板
Bitmap temp = new Bitmap(1, 1, pixelFormat);
palette = temp.Palette;
temp.Dispose();
}
return palette;
}

/// <summary>
/// 根據顏色深度,創建對應的調色板
/// </summary>
/// <param name="depth">顏色深度,即表示顏色所用的位數</param>
/// <returns>返回調色板</returns>
private static ColorPalette CreateColorPalette(int depth)
{
//根據顏色數,決定使用什么樣的調色板
PixelFormat pixelFormat = PixelFormat.Format1bppIndexed;
if (depth > 2)
pixelFormat = PixelFormat.Format4bppIndexed;
if (depth > 16)
pixelFormat = PixelFormat.Format8bppIndexed;
return CreateColorPalette(pixelFormat);
}

/// <summary>
/// 創建單色灰度調色板
/// </summary>
/// <returns>返回調色板</returns>
private static ColorPalette CreateGrayscalePalette()
{
ColorPalette palette = CreateColorPalette(PixelFormat.Format1bppIndexed);
palette.Entries[0] = Color.FromArgb(0, 0, 0, 0);
palette.Entries[1] = Color.FromArgb(0, 255, 255, 255);
return palette;
}

/**
* byte數組中取int數值,本方法適用于(低位在前,高位在后)的順序。
*
* @param ary
* byte數組
* @param offset
* 從數組的第offset位開始
* @return int數值
*/
private static int bytesToInt(byte[] ary, int offset)
{
int value;
value = (int)((ary[offset] & 0xFF)
| ((ary[offset + 1] << 8) & 0xFF00)
| ((ary[offset + 2] << 16) & 0xFF0000)
| ((ary[offset + 3] << 24) & 0xFF000000));
return value;
}


/// <summary>
/// 轉換為單色位圖后,圖像信息頭中的位圖使用的顏色數及指定重要的顏色數設置為0
/// </summary>
/// <param name="img"></param>
/// <returns></returns>
private static string ConvertToBpp(Bitmap bitMap)
{
//打開任一索引色的或者非索引色的圖像
Bitmap bm = xxx(bitMap);
MemoryStream ms = new MemoryStream();
bm.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] buffer = new byte[ms.Length];
//Image.Save()會改變MemoryStream的Position,需要重新Seek到Begin
ms.Seek(0, SeekOrigin.Begin);
ms.Read(buffer, 0, buffer.Length);

byte[] bitLenght = new byte[4];
Array.Copy(buffer, 2, bitLenght, 0, 4);
int ibitlen = bytesToInt(bitLenght, 0);

//byte[] bitBuffer = new byte[2];
//bitBuffer[0] = 0x2C;
//bitBuffer[1] = 0x04;
//Array.Copy(bitBuffer, 0, buffer, 34, 2);
Array.Copy(bitLenght, 0, buffer, 34, 4);

byte[] bitmapBuffer = new byte[1];
bitmapBuffer[0] = 0;
Array.Copy(bitmapBuffer, 0, buffer, 46, 1);
Array.Copy(bitmapBuffer, 0, buffer, 50, 1);

FileStream fs = null;
string file = Guid.NewGuid().ToString().Replace("-","").ToString() + ".bmp";
//將待寫的入數據從字符串轉換為字節數組
fs = File.OpenWrite(file);
//設定書寫的開始位置為文件的末尾
fs.Position = 0;//fs.Length
//將待寫入內容追加到文件末尾
fs.Write(buffer, 0, ibitlen);
fs.Close();
bm.Dispose();
return file;
}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲免费视频一区二区| 成人黄色网免费| 萌白酱国产一区二区| 97在线免费观看视频| 97激碰免费视频| 日本sm极度另类视频| 国产精品免费观看在线| 亚洲成av人乱码色午夜| 亚洲美女www午夜| 日本不卡免费高清视频| 搡老女人一区二区三区视频tv| 欧美性生交xxxxxdddd| 日韩av免费在线观看| 欧美精品在线免费播放| 亚洲在线观看视频网站| 亚洲免费一在线| 亚洲精品国产精品国产自| 国内精品久久久久伊人av| 日韩中文在线视频| 91在线高清免费观看| 久久久人成影片一区二区三区观看| 国产欧美va欧美va香蕉在| 97精品国产91久久久久久| 日韩电影免费观看在线观看| 国产日产久久高清欧美一区| 国产精品18久久久久久麻辣| 国模吧一区二区三区| 久久久精品视频成人| 正在播放国产一区| 久久精品国产亚洲一区二区| 亚洲欧美另类人妖| 日本不卡免费高清视频| 午夜精品www| 久久精品亚洲国产| 日韩免费观看在线观看| 日韩av片免费在线观看| 91精品国产成人www| 欧美性开放视频| 欧美日韩国产激情| 日韩中文在线视频| 欧美老妇交乱视频| 欧美视频中文字幕在线| 中文字幕日韩在线观看| 色偷偷偷亚洲综合网另类| 亚洲第一色中文字幕| 日韩视频欧美视频| 日韩在线观看免费| 国产欧美精品久久久| 欧美黑人一区二区三区| 欧美在线免费视频| 日韩av片永久免费网站| 日韩电影中文字幕av| 91精品国产91| 欧亚精品在线观看| 亚洲第一黄色网| 欧美丝袜美女中出在线| 日韩福利在线播放| 欧美三级欧美成人高清www| 91麻豆国产语对白在线观看| 国产一区二区三区四区福利| 日韩精品视频三区| 高清日韩电视剧大全免费播放在线观看| 欧美激情中文网| 日韩精品免费在线视频| 欧美极品少妇xxxxⅹ裸体艺术| 日韩视频第一页| 国产亚洲欧美日韩一区二区| 亚洲欧美制服丝袜| 亚洲男人第一av网站| 欧美伊久线香蕉线新在线| 欧美精品精品精品精品免费| 久久成人一区二区| 国产一区二区免费| 欧美日韩亚洲天堂| 国产精品激情av电影在线观看| 国产精品户外野外| 欧美性xxxxx极品| 国产亚洲欧美aaaa| 色妞欧美日韩在线| 91精品国产高清久久久久久91| …久久精品99久久香蕉国产| 亚洲电影天堂av| 成人亚洲欧美一区二区三区| 成人免费在线网址| 国产精品美女无圣光视频| 久久久999成人| 91免费视频网站| 中文字幕在线日韩| 欧美午夜宅男影院在线观看| 日韩日本欧美亚洲| 国产精品美女久久久久久免费| 97欧美精品一区二区三区| 欧美大全免费观看电视剧大泉洋| 亚洲一区二区三区成人在线视频精品| 欧美黑人又粗大| 国产精品视频自在线| 日韩**中文字幕毛片| 久久久精品美女| 成人性生交大片免费看小说| 日韩av高清不卡| 日韩一区二区欧美| 精品动漫一区二区三区| 色综合导航网站| 精品中文字幕乱| 欧美午夜精品久久久久久人妖| 精品久久中文字幕久久av| 欧美激情小视频| 日韩成人黄色av| 91精品久久久久久久久久久久久久| 富二代精品短视频| 国内成人精品一区| 97激碰免费视频| 精品夜色国产国偷在线| 欧美日韩精品中文字幕| 韩剧1988在线观看免费完整版| 欧洲日本亚洲国产区| 疯狂蹂躏欧美一区二区精品| 成人精品视频在线| 在线观看久久久久久| 亚洲国产日韩欧美在线图片| 国产一区二区三区久久精品| 国产亚洲精品一区二555| 日韩欧美在线视频观看| 欧美日韩在线视频首页| 亚洲国产日韩欧美在线99| 2021国产精品视频| 国产日韩精品入口| 欧美日韩免费看| 欧美日韩aaaa| 自拍偷拍免费精品| 亚洲视频在线观看网站| 久久久精品视频在线观看| 欧美激情18p| 欧美乱妇高清无乱码| 日韩av综合中文字幕| 亚洲精品福利免费在线观看| 91sa在线看| 一本色道久久综合狠狠躁篇怎么玩| 91九色单男在线观看| 高清欧美性猛交xxxx| 亚洲色图偷窥自拍| 久久久精品网站| 91免费观看网站| 18一19gay欧美视频网站| 色婷婷av一区二区三区在线观看| 91探花福利精品国产自产在线| 久久在线精品视频| 九九热最新视频//这里只有精品| 日本精品免费一区二区三区| 国产精品免费一区二区三区都可以| 亚洲性xxxx| 国语自产精品视频在线看一大j8| 在线国产精品视频| 欧美刺激性大交免费视频| 亚洲va久久久噜噜噜| 大伊人狠狠躁夜夜躁av一区| 成人a在线观看| 国产成人精品日本亚洲| 欧美另类在线播放| 欧美日韩国产一区二区| 欧美日本高清视频| 日韩电影在线观看中文字幕| 亚洲综合日韩中文字幕v在线| 欧美高清理论片|