首先要明白二维码其实就是一张图片,而扫出来的二维码其实就是string,经过百度我了解到如果想要打印二维码,前端(VS2016)可以用byte[]流的形式或者64BaseString形式向后端发送二维码打印数据,byte[]实际上存储了二维码各个位置的像素数据,打印机接收到byte[]字节流在转化成图片格式的变量插入到图片控件就可完成。了解上面基本信息之后,下面开始介绍我摸索过程中遇到的诸多问题。
首先,在百度上找一个生成二维码图片的方法(百度上很多),如下
public Bitmap code(string msg)
{QRCoder.QRCodeGenerator code_generator = new QRCoder.QRCodeGenerator();
QRCoder.QRCodeData code_data = code_generator.CreateQrCode(msg, QRCoder.QRCodeGenerator.ECCLevel.M);
QRCoder.QRCode code = new QRCoder.QRCode(code_data);
Bitmap bmp = code.GetGraphic(20, Color.Black, Color.White, null, 15, 6,true);
return bmp;}这里返回的是一个BimMap格式的图形变量(跟JPG,PNG)一样,说白了这就是二维码图片,这个方法网上很多,然后在通过一下方法 bmp = _qr.code("Happy"); MemoryStream ms = new MemoryStream();bp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);_bytecode = ms.ToArray();到这里就把Happy的二维码以字节流的形式赋给了bytecode 变量,bytecode 变量定义的类型是byte[],到这里一切都很顺利,下面才是问题的关键。
最开始我了解到打印机模块(后端)以接收DataTable类型的变量,然后byte[] imgData=(byte[])Report.GetColumnValue("表名.QRCODE),这个QRCODE就是该表的一个字段,于是我 row["QRCODE"] =bytecode将改byte[]存到表里,VS端用 report.RegisterData(table1)发送该表,结果发现打印模块接受的数据读出该表的QRCODE字段位空,原因不得而知(理论上行的通),经过失败之后只能放弃该方法,于是将bytecode的字节流通过string 64StringQrcode=Convert.ToBase64String(bytecode)强制转化成64Base的字符串同样存到表中,但是发现64string的数据太大存到表里直接变成了乱码,后端理论上可以先将传来的64位字符串先解析成byte,在将byte编码成img格式的图片,但是又经过一番尝试还是失败了,最后只能放弃以DataTable类型的变量传递,于是经过一番百度找到了单变量传递的方法, report.SetParameterValue("Parameter", _bytecode),VS2016端向打印模块发送bytecode,在后端以 byte[] imgData=(byte[])Report.GetParameterValue("Parameter")接收bytecode,后面问题就简单了,调用下面方法MemoryStream ms = new MemoryStream(imgDate1);Image img = System.Drawing.Image.FromStream(ms);重新把bytecode解析成BMP格式的图像变量,再用
Picture3.Image=img;插入到图片控件中就算完成了添加链接描述