C++生成二维码总结

来源:互联网 发布:pc6下载站,软件 编辑:程序博客网 时间:2024/05/30 02:24

http://blog.sina.com.cn/s/blog_74661d9f0101i6ir.html


1二维码基本知识的资料,网上非常多,本质上就是一种数据的加密过程,设计到编码与校验,冗余等处理。这方面的资料就不展开了,可以自行搜索。

2 二维码相关的库,在手机上的库比较有名的是zxing和zbar,google开源的库zxing比较合适。不过这些库都只有C++的解码,而不支持C++的编码,都有Java和C#相关的编码和解码。如果你是在手机上开发,这两个库都可以用。

3Windows下,要编码的话,还有一个叫QR的库,CSDN下载里面能找到,我找到了多个版本,一个是采用模板文件方式,带一堆的模板文件,最后被我放弃,因为我的程序带着这么一大堆模板文件不太方便,另外一种库则全部自动生成,不需要模板文件。把编码部分的源代码剥离出来,做个DLL,效果还是比较好的,能够生成BMP文件和BITMAP对象。

4不管哪个库,最后编码得到的数据结构,都是一个二维数组,数组中的1表示黑点,0表示白点。有的版本提供了将数据转换成图片的功能,有的需要自己绘制成图片。

注意点:

1在将数据结构形成图像时,要扩展线宽,因为原来的数据只是一个点,把每个点绘制到一个像素上,太小了点,需要放大,每个点需要好几个像素来绘制,这里需要注意。

2绘制后,确实形成了一个二维码图,可以用手机试试解码。如果解析不出来,可以把屏幕截屏然后粘贴到画图里面,将图片镜像一下,看看是否能解析,如果能解析,需要在生成图片的时候做好数据的倒序处理。如果还不能解析,那就有错了。

3如果要写入中文,应该用Unicode字符串,然后用WideCharToMultiByte转换成UTF8字符串,然后再编码,肯定可以写入中文的。

4二维码有冗余功能,因此破坏掉一部分也没问题,手机还能识别,这个时候,就可以在图片中心贴上一个LOGO小图片了,中心的小图片一般是不会影响二维码识别的。当然,这里最好提高二维码的冗余级别设置到第三级。

其他就没什么了,调用也很简单,注意Bmp写入文件的时候,宽度一定要是4的倍数。


http://blog.csdn.net/weichaohnu/article/details/8275829

        由于实验要求,需要C++环境下生成QR二维码。然后把QR二维码图片在Matlab环境下进行解码。

        了解了一阵子,发现几个比较ok的库。

        1、最早的一个是老板发过来的,是C#和.net环境下使用的,但是由于我的timeGenerator程序是MFC的,基本调用不了那个dll,被我pass了!

              需要的可以自己去看看:http://www.keepdynamic.com/barcoding/csharp-barcode-generator.shtml

        2、一个是BSSBarcode的库,貌似要花钱买,不过可以download,MFC下用的就是这个

http://www.barcodesoftwaresolutions.com/index.php?section=Products&subsection=QRCodeGenerator

        3、是谷歌的ZXing库(matlab下的decode部分就是基于这个的库):https://code.google.com/p/zxing/


        好了,现在已经决定用第二个库了,使用方法非常简单,其目录下也有sdk说明文档,说得非常详细!

        首先把bssQRCodeGenerator.dll,bssQRCodeGenerator.lib,bssQRCodeGenerator.h都丢到项目目录里面去


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #include "bssQRCodeGenerator.h:  
  2. #pragma comment(lib,"bssQRCodeGenerator.lib")  
  3.   
  4. unsigned char *m_pImgData    = 0;  
  5. int m_nImgWidth   = 0;  
  6. int m_nImgHeight  = 0;  
  7. int m_nImgRowDist = 0;  
  8. int m_nImgModSize = 2;//二维码图像大小相当于是(29*size)*(29*size)  
  9.   
  10. CString timeContent = "blog.csdn.com/weichaohnu";  
  11. const char *Content = (LPCTSTR)timeContent;  
  12. int m_nRes = BSS_GenerateQRCode( Content,  
  13.                                  timeContent.GetLength(),  
  14.                                  m_nImgModSize,  
  15.                                  4,  
  16.                                  (void**)&m_pImgData,//m_pImgData就是每个像素点的8位数据  
  17.                                  m_nImgWidth,//m_nImgWidth是图像宽度,这里的结果是29的倍数,导致都不是4的倍数  
  18.                                  m_nImgHeight,//图像高度  
  19.                                  m_nImgRowDist );//所以m_nImgRowDist会比m_nImgWidth大点,但是是4的倍数,这是为了位图存储(windows下位图每行的字节数必须是4的倍数) 

0 0
原创粉丝点击