Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30995330
  • 博文数量: 230
  • 博客积分: 2868
  • 博客等级: 少校
  • 技术积分: 2223
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-08 21:48
个人简介

Live & Learn

文章分类

全部博文(230)

文章存档

2022年(2)

2019年(5)

2018年(15)

2017年(42)

2016年(24)

2015年(13)

2014年(1)

2012年(5)

2011年(58)

2010年(56)

2009年(9)

我的朋友

分类: Windows平台

2017-12-25 15:03:45


原创 2015年08月11日 17:51:20
  • 8404

一、简介

        二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,其应用广泛,如:产品防伪/溯源、广告推送、网站链接、数据下载、商品交易、定位/导航、电子凭证、车辆管理、信息传递、名片交流、wifi共享等。
     一维码是用条空在水平方向上表达信息的条码,外形更接近矩形;二维码可以说是正方形,在其内部有三个“回”字型的定位点,可以帮助条码设备对焦,便于读取数据。一维码的信息部分只能是字母和数字,它的数据容量较小一般只可容纳30个字符左右。二维码的信息承载量很大,最大数据含量可达1850个字符,信息内容可包含,字母,数字,汉字,字符,片假名等。一维码的常用码制包括:EAN码、39码、交叉25码、UPC码、128码、93码,ISBN码,及Codabar(库德巴码)等;二维码常用的码制有:PDF417二维条码,Datamatrix二维条码,QR Code,Code 49,Code 16K,Code one等。



二、详解

1、libqrencode库(生成二维码)

(1)qrcodewidget.h

[html] view plain copy
  1. #ifndef QRCODE_H  
  2. #define QRCODE_H  
  3.   
  4. #include <QWidget>  
  5. #include <QTextCodec>  
  6.   
  7. namespace Ui {  
  8. class QRCode;  
  9. }  
  10.   
  11. class QRCodeWidget : public QWidget  
  12. {  
  13.     Q_OBJECT  
  14.   
  15. public:  
  16.     explicit QRCodeWidget(QWidget *parent = 0);  
  17.     ~QRCodeWidget();  
  18.   
  19. private slots:  
  20.     void on_pushButton_clicked();  
  21.   
  22. private:  
  23.     Ui::QRCode *ui;  
  24. };  
  25.   
  26. #endif // QRCODE_H  


(2)qrcodewidget.cpp


[html] view plain copy
  1. #include <QPicture>  
  2. #include "qrcodewidget.h"  
  3. #include "ui_qrcode.h"  
  4. #include "qrencode.h"  
  5. #include "qrenc.c"  
  6.   
  7. QRCodeWidget::QRCodeWidget(QWidget *parent) :  
  8.     QWidget(parent, Qt::Dialog),  
  9.     ui(new Ui::QRCode)  
  10. {  
  11.     QTextCodec *codec = QTextCodec::codecForName("utf8");  
  12.     QTextCodec::setCodecForLocale(codec);  
  13.     QTextCodec::setCodecForCStrings(codec);  
  14.     QTextCodec::setCodecForTr(codec);  
  15.     ui->setupUi(this);  
  16. }  
  17.   
  18. QRCodeWidget::~QRCodeWidget()  
  19. {  
  20.     delete ui;  
  21. }  
  22.   
  23. void QRCodeWidget::on_pushButton_clicked()  
  24. {  
  25.     QString info = ui->lineEdit->text();  
  26.     if (info.isEmpty()) {  
  27.         return;  
  28.     }  
  29.     char outfile[] = "output.png";  
  30.     margin = 2;  
  31.     ::size = 7;  
  32.     version = 2;  
  33.     //QRcode *qrcode = QRcode_encodeString(info.toStdString().data(), 2, QR_ECLEVEL_L, QR_MODE_8, 0);  
  34.     //writePNG(qrcode, outfile);  
  35.   
  36.     qrencode((unsigned char *)info.toStdString().data(), info.length(), outfile);  
  37.     ui->label_3->setPixmap(QPixmap(outfile));  
  38. }  

(3)main.cpp


[html] view plain copy
  1. #include "qrcodewidget.h"  
  2. #include <QApplication>  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     QRCodeWidget w;  
  8.     w.show();  
  9.   
  10.     return a.exec();  
  11. }  


(4)运行

           

       也可是使用QrenCode 的命令行工具生成二维码,在centos6.6下执行# yum install qrencode(或下载qrencode-3.4.4.tar.gz使用./configure、make、make install安装);使用qrencode -o output.png 即可在当前目录下生成百度的二维码图片output.png;若想自定义尺寸的话,加上 -s 参数,比如 -s 6 表示尺寸为 6x6 平方像表大小,qrencode -s 6 -o output.png 。命令行下识别二维码的是#yum install libdecodeqr-examples,libdecodeqr-simpletest <二维码图片>。安装zbar-0.10.tar.bz2,也可一识别二维码。

      

(5)源码可从csdn上下载:

2、zbar库(识别二维码)

      下载的源码:zbar-0.10.tar.bz2,执行./configure和make和make install安装zbar,默认安装头文件在/usr/local/include下,库文件在/usr/local/lib。
(1)qrcodezbar.h
[html] view plain copy
  1. #ifndef QRCODEZBAR_H  
  2. #define QRCODEZBAR_H  
  3.   
  4. #include <QWidget>  
  5. #include <QTextCodec>  
  6. #include <QFileDialog>  
  7. #include <zbar/QZBar.h>  
  8.   
  9. namespace Ui {  
  10. class QZbar;  
  11. }  
  12.   
  13.   
  14. class QRCodeZbar : public QWidget  
  15. {  
  16.     Q_OBJECT  
  17.   
  18. public:  
  19.     QRCodeZbar(QWidget *parent = 0);  
  20.     ~QRCodeZbar();  
  21.   
  22. private:  
  23.   
  24.   
  25. private slots:  
  26.     void on_pushButton_clicked();  
  27.   
  28. private:  
  29.     Ui::QZbar *ui;  
  30.     zbar::QZBar *qz;  
  31. };  
  32.   
  33. #endif // QRCODEZBAR_H  
(2)qrcodezbar.cpp
[html] view plain copy
  1. #include "qrcodezbar.h"  
  2. #include "ui_qzbar.h"  
  3. #include "scanimage.h"  
  4. #ifdef QRDECODE  
  5.     #include "scanimagemagick.h"  
  6. #endif  
  7.   
  8. QRCodeZbar::QRCodeZbar(QWidget *parent)  
  9.     : QWidget(parent, Qt::Dialog)  
  10.     , ui(new Ui::QZbar)  
  11. {  
  12.     QTextCodec *codec = QTextCodec::codecForName("utf8");  
  13.     QTextCodec::setCodecForLocale(codec);  
  14.     QTextCodec::setCodecForCStrings(codec);  
  15.     QTextCodec::setCodecForTr(codec);  
  16.     ui->setupUi(this);  
  17. }  
  18.   
  19. QRCodeZbar::~QRCodeZbar()  
  20. {  
  21.   
  22. }  
  23.   
  24. void QRCodeZbar::on_pushButton_clicked()  
  25. {  
  26.     QString fileName = QFileDialog::getOpenFileName(this, tr("choose a picture"),  
  27.                                                     QApplication::applicationDirPath(),  
  28.                                                     tr("all Files (*.*)"));  
  29.     ui->lineEdit->setText(fileName);  
  30.     ui->label_3->setPixmap(QPixmap(ui->lineEdit->text()));  
  31.     char result[1024] = {0};  
  32.     #ifdef QRDECODE  
  33.         scanimagemagick(ui->lineEdit->text().toStdString().data(), result);  
  34.     #else  
  35.         scanimage(ui->lineEdit->text().toStdString().data(), result);  
  36.     #endif  
  37.     ui->textEdit->setText(result);  
  38. }  
(3)scanimagemagick.h
[html] view plain copy
  1. #ifndef SCANIMAGEMAGICK_H  
  2. #define SCANIMAGEMAGICK_H  
  3. #include <iostream>  
  4. #include <Magick++.h>  
  5. #include <zbar.h>  
  6. #define STR(s) #s  
  7. /*****************  
  8.  * yum install ImageMagick  
  9.  ***********/  
  10. using namespace std;  
  11. using namespace zbar;  
  12.   
  13. int scanimagemagick (const char *filename, char *result);  
  14.   
  15. #endif // SCANIMAGE_H  
(4)scanimagemagick.cpp
[html] view plain copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include "scanimagemagick.h"  
  5.   
  6. int scanimagemagick(const char *filename, char *result)  
  7. {  
  8. #ifdef MAGICK_HOME  
  9.     // http://www.imagemagick.org/Magick++/  
  10.     //    under Windows it is necessary to initialize the ImageMagick  
  11.     //    library prior to using the Magick++ library  
  12.     Magick::InitializeMagick(MAGICK_HOME);  
  13. #endif  
  14.   
  15.     // create a reader  
  16.     ImageScanner scanner;  
  17.   
  18.     // configure the reader  
  19.     scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);  
  20.   
  21.     // obtain image data  
  22.     Magick::Image magick(filename);  // read an image file  
  23.     int width = magick.columns();   // extract dimensions  
  24.     int height = magick.rows();  
  25.     Magick::Blob blob;              // extract the raw data  
  26.     magick.modifyImage();  
  27.     magick.write(&blob, "GRAY", 8);  
  28.     const void *raw = blob.data();  
  29.   
  30.     // wrap image data  
  31.     Image image(width, height, "Y800", raw, width * height);  
  32.   
  33.     // scan the image for barcodes  
  34.     int n = scanner.scan(image);  
  35.   
  36.     // extract results  
  37.     for(Image::SymbolIterator symbol = image.symbol_begin();  
  38.         symbol != image.symbol_end();  
  39.         ++symbol) {  
  40.         // do something useful with results  
  41. //        cout << "decoded " << symbol->get_type_name()  
  42. //             << " symbol \"" << symbol->get_data() << '"' << endl;  
  43.         sprintf(result, "%s:%s", symbol->get_type_name().data(), symbol->get_data().data());  
  44.     }  
  45.   
  46.     // clean up  
  47.     image.set_data(NULL, 0);  
  48.   
  49.     return(0);  
  50. }  
(5)运行结果
  
(6)源码可从csdn上下载:
(7)提示
       打开编译选项DEFINES *= QRDECODE,则使用了ImageMagick,则需要安装#yum install ImageMagick,并加入头文件路径/usr/include/ImageMagick/。若不是用QRDECODE,用C库,再识别有些png文件时会出现段错误。上述zbar有中文乱码,可参考网上修改。

3、QZxing库(识别二维码)

        从下载QZxing的decoding library的源码,在工程中加入include(QZXing_sourceV2.3/QZXing.pri)。
(1)qrcondezxing.h

[html] view plain copy
  1. #ifndef QRCONDEZXING_H  
  2. #define QRCONDEZXING_H  
  3.   
  4. #include <QWidget>  
  5. #include <QTextCodec>  
  6. #include <QFileDialog>  
  7.   
  8. namespace Ui {  
  9. class QRCondeZxing;  
  10. }  
  11.   
  12. class QRCondeZxing : public QWidget  
  13. {  
  14.     Q_OBJECT  
  15.   
  16. public:  
  17.     explicit QRCondeZxing(QWidget *parent = 0);  
  18.     ~QRCondeZxing();  
  19.   
  20. private slots:  
  21.     void on_pushButton_clicked();  
  22.   
  23. private:  
  24.     Ui::QRCondeZxing *ui;  
  25. };  
  26.   
  27. #endif // QRCONDEZXING_H  
(2)qrcondezxing.cpp
[html] view plain copy
  1. #include "qrcondezxing.h"  
  2. #include "ui_qrcondezxing.h"  
  3. #include "QZXing.h"  
  4.   
  5. QRCondeZxing::QRCondeZxing(QWidget *parent) :  
  6.     QWidget(parent),  
  7.     ui(new Ui::QRCondeZxing)  
  8. {  
  9.     QTextCodec *codec = QTextCodec::codecForName("utf8");  
  10.     QTextCodec::setCodecForLocale(codec);  
  11.     QTextCodec::setCodecForCStrings(codec);  
  12.     QTextCodec::setCodecForTr(codec);  
  13.     ui->setupUi(this);  
  14. }  
  15.   
  16. QRCondeZxing::~QRCondeZxing()  
  17. {  
  18.     delete ui;  
  19. }  
  20.   
  21. void QRCondeZxing::on_pushButton_clicked()  
  22. {  
  23.     QString fileName = QFileDialog::getOpenFileName(this, tr("choose a picture"),  
  24.                                                     QApplication::applicationDirPath(),  
  25.                                                     tr("all Files (*.*)"));  
  26.     ui->lineEdit->setText(fileName);  
  27.     ui->label_3->setPixmap(QPixmap(ui->lineEdit->text()));  
  28.     QZXing decoder;  
  29.     QString qrmsg = decoder.decodeImageFromFile(ui->lineEdit->text());  
  30.     ui->textEdit->setText(qrmsg);  
  31. }  
(3)运行结果:


 

(4)源码可从csdn上下载:

三、条形码/二维码开源软件


(1)二维码扫描工具和开发包ZBar
        ZBar是款桌面电脑用条形码/二维码扫描工具,支持摄像头及图片扫描,支持多平台包括 iPhone 手机。同时 ZBar 提供了二维码扫描的 API 开发包。 ZBar 目前支持扫描,除了 Windows 平台外,还支持 Linux 及 iPhone 平台。网址:
(2)C语言二维条形码解析库libqrencode
        libqrencode (QRencode) 是一个用C语言编写的用来解析二维条形码(QR Code)的程序库,libqrencode通过手机的CCD摄像头来扫描二维条形码。网址:
(3)条形码扫描软件 Zebra barcode reader
        Zebra barcode reader是一个小型的,分层次的条形码扫描软件。它支持许多流行的条码符号:EAN,UPC,128码,39码等。能抓获条码解码图像和使用视频设备(如摄像头)作为一个条形码扫描仪。
(4)QZXing
        Qt包装ZXing的解码库。ZXing是条形码处理类库,它是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、Data Matrix、UPC的1D条形码进行解码。 其提供了多种平台下的客户端包括:J2ME、J2SE和Android。网址:
       其他参考:
?lang=21&sort=v-

四、总结

(1)二维码和条形码的开源软件种类很多,可针对C、Java、ios等不同接口来选择自己的需求。
(2)二维码的库在中文方面的也是有支持的。
(3)源码使用中仅仅进行了简单的调用,没有实现更深层次的开发,主要是自己没有项目需求,其他的开发读者可继续开发。
(4)若有建议,请留言,在此先感谢!
阅读(3746) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~