好奇驱使,百度百科了一下二维码,然后想尝试通过编程识别几个维码。
第一步是找到合适的二维码识别程序。伟大的程序员们已经把
二维码识别程序开源了,我选择了gooogle公司的ZXing。
https://github.com/zxing/zxing
介绍就一句话:
ZXing ("Zebra Crossing") barcode scanning library for Java, Android
翻译过来是:ZXing是一个条码扫描库,支持Java和Android。
这个支持的条码格式如下表:
1D product | 1D industrial | 2D(二维码) |
---|---|---|
UPC-A | Code 39 | QR Code |
UPC-E | Code 93 | Data Matrix |
EAN-8 | Code 128 | Aztec (beta) |
EAN-13 | Codabar | PDF 417 (beta) |
ITF | MaxiCode | |
RSS-14 | ||
RSS-Expanded |
还有一些基于ZXing的第三方程序,它们适配各种编程语言。因为,我习惯用C/C++开发程序,且最近正在学习QT,所以选择了
QZXing。
第二步是使用QZXing。我在https://github.com/ftylitak/qzxing/releases页面下载了
QZXing_sourceV2.4.zip,只有353KB,太好了,因为我的歌华宽带访问
github.com的速度真是太慢了,不知你们的怎么网速怎么样?解压后,用Qt Createor打开其中的工程,编译出Debug版。在build-QZXing-Desktop_Qt_5_10_0_MinGW_32bit-Debug\debug目录下得到2个重要文件:libQZXing2.a(等同于lib文件)和QZXing2.dll(不用解释了吧)。然后在我的工程中添加库,选择
libQZXing2.a即可。帖上代码:
QString
fileName
=
QFileDialog::
getOpenFileName(
this,
tr("打开二维码文件"), NULL, tr("二维码文件 (*.png *.jpg *.bmp)"));
QZXing *qZxing = new QZXing(this);
//qZxing->setDecoder(QZXing::DecoderFormat_QR_CODE | QZXing::DecoderFormat_EAN_13 );
QImage imageToDecode(fileName);
QString strCode = qZxing->decodeImage(imageToDecode);
//QString strCode = qZxing->decodeImageFromFile(fileName);//TODO 失败了
ui->ed2DCode->setText(strCode);
int with = ui->lb2DCode->width();
int height = ui->lb2DCode->height();
//QPixmap fitpixmap = pixmap.scaled(with, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); // 饱满填充
QImage fitpixmap = imageToDecode.scaled(with, height, Qt::KeepAspectRatio, Qt::SmoothTransformation); // 按比例缩放
ui->lb2DCode->setPixmap(QPixmap::fromImage(fitpixmap));
代码的意思是选择一个二维码文件,得到其QImage对象,然后用QZXing去解码这个QImage对象,得到一个QString,后面的代码是在QLable中按比例缩放显示二维码文件。需要说明的是采用
qZxing->decodeImageFromFile只得到一个空字符串。不去深究了,有能工作的就OK了。以下是我解码的几个二维码。
首先是网页版微信登录使用的二维码,它对应的文字是https://login.weixin.qq.com/l/wfzgb86dKA==

第二个是我的微信二维码,它对应的文字是https://u.wechat.com/EALebLzIfjaNxLdx4MP1prA
