生活随笔
收集整理的這篇文章主要介紹了
Qt浅谈之三十二二维码条形码解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉自:Qt淺談之三十二二維碼條形碼解析
一、簡介
??????? 二維條碼/二維碼(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 plaincopy
#ifndef?QRCODE_H?? #define?QRCODE_H?? ?? #include?<QWidget>?? #include?<QTextCodec>?? ?? namespace?Ui?{?? class?QRCode;?? }?? ?? class?QRCodeWidget?:?public?QWidget?? {?? ????Q_OBJECT?? ?? public:?? ????explicit?QRCodeWidget(QWidget?*parent?=?0);?? ????~QRCodeWidget();?? ?? private?slots:?? ????void?on_pushButton_clicked();?? ?? private:?? ????Ui::QRCode?*ui;?? };?? ?? #endif?//?QRCODE_H??
(2)qrcodewidget.cpp
[html]?view plaincopy
#include?<QPicture>?? #include?"qrcodewidget.h"?? #include?"ui_qrcode.h"?? #include?"qrencode.h"?? #include?"qrenc.c"?? ?? QRCodeWidget::QRCodeWidget(QWidget?*parent)?:?? ????QWidget(parent,?Qt::Dialog),?? ????ui(new?Ui::QRCode)?? {?? ????QTextCodec?*codec?=?QTextCodec::codecForName("utf8");?? ????QTextCodec::setCodecForLocale(codec);?? ????QTextCodec::setCodecForCStrings(codec);?? ????QTextCodec::setCodecForTr(codec);?? ????ui->setupUi(this);?? }?? ?? QRCodeWidget::~QRCodeWidget()?? {?? ????delete?ui;?? }?? ?? void?QRCodeWidget::on_pushButton_clicked()?? {?? ????QString?info?=?ui->lineEdit->text();?? ????if?(info.isEmpty())?{?? ????????return;?? ????}?? ????char?outfile[]?=?"output.png";?? ????margin?=?2;?? ????::size?=?7;?? ????version?=?2;?? ????//QRcode?*qrcode?=?QRcode_encodeString(info.toStdString().data(),?2,?QR_ECLEVEL_L,?QR_MODE_8,?0);?? ????//writePNG(qrcode,?outfile);?? ?? ????qrencode((unsigned?char?*)info.toStdString().data(),?info.length(),?outfile);?? ????ui->label_3->setPixmap(QPixmap(outfile));?? }??
(3)main.cpp
[html]?view plaincopy
#include?"qrcodewidget.h"?? #include?<QApplication>?? ?? int?main(int?argc,?char?*argv[])?? {?? ????QApplication?a(argc,?argv);?? ????QRCodeWidget?w;?? ????w.show();?? ?? ????return?a.exec();?? }??
(4)運行
???????????
?????? 也可是使用QrenCode 的命令行工具生成二維碼,在centos6.6下執行#?yum install qrencode(或下載qrencode-3.4.4.tar.gz使用./configure、make、make install安裝);使用qrencode -o output.png https://www.baidu.com/即可在當前目錄下生成百度的二維碼圖片output.png;若想自定義尺寸的話,加上 -s 參數,比如 -s 6 表示尺寸為 6x6 平方像表大小,qrencode -s 6 -o output.png https://www.baidu.com/。命令行下識別二維碼的是#yum install libdecodeqr-examples,libdecodeqr-simpletest <二維碼圖片>。安裝zbar-0.10.tar.bz2,也可一識別二維碼。
??????
(5)源碼可從csdn上下載:http://download.csdn.net/detail/taiyang1987912/8991975。
2、zbar庫(識別二維碼)
????? 下載http://sourceforge.net/projects/zbar/files/?source=navbar的源碼:zbar-0.10.tar.bz2,執行./configure和make和make install安裝zbar,默認安裝頭文件在/usr/local/include下,庫文件在/usr/local/lib。
(1)qrcodezbar.h
[html]?view plaincopy
#ifndef?QRCODEZBAR_H?? #define?QRCODEZBAR_H?? ?? #include?<QWidget>?? #include?<QTextCodec>?? #include?<QFileDialog>?? #include?<zbar/QZBar.h>?? ?? namespace?Ui?{?? class?QZbar;?? }?? ?? ?? class?QRCodeZbar?:?public?QWidget?? {?? ????Q_OBJECT?? ?? public:?? ????QRCodeZbar(QWidget?*parent?=?0);?? ????~QRCodeZbar();?? ?? private:?? ?? ?? private?slots:?? ????void?on_pushButton_clicked();?? ?? private:?? ????Ui::QZbar?*ui;?? ????zbar::QZBar?*qz;?? };?? ?? #endif?//?QRCODEZBAR_H??
(2)
qrcodezbar.cpp
[html]?view plaincopy
#include?"qrcodezbar.h"?? #include?"ui_qzbar.h"?? #include?"scanimage.h"?? #ifdef?QRDECODE?? ????#include?"scanimagemagick.h"?? #endif?? ?? QRCodeZbar::QRCodeZbar(QWidget?*parent)?? ????:?QWidget(parent,?Qt::Dialog)?? ????,?ui(new?Ui::QZbar)?? {?? ????QTextCodec?*codec?=?QTextCodec::codecForName("utf8");?? ????QTextCodec::setCodecForLocale(codec);?? ????QTextCodec::setCodecForCStrings(codec);?? ????QTextCodec::setCodecForTr(codec);?? ????ui->setupUi(this);?? }?? ?? QRCodeZbar::~QRCodeZbar()?? {?? ?? }?? ?? void?QRCodeZbar::on_pushButton_clicked()?? {?? ????QString?fileName?=?QFileDialog::getOpenFileName(this,?tr("choose?a?picture"),?? ????????????????????????????????????????????????????QApplication::applicationDirPath(),?? ????????????????????????????????????????????????????tr("all?Files?(*.*)"));?? ????ui->lineEdit->setText(fileName);?? ????ui->label_3->setPixmap(QPixmap(ui->lineEdit->text()));?? ????char?result[1024]?=?{0};?? ????#ifdef?QRDECODE?? ????????scanimagemagick(ui->lineEdit->text().toStdString().data(),?result);?? ????#else?? ????????scanimage(ui->lineEdit->text().toStdString().data(),?result);?? ????#endif?? ????ui->textEdit->setText(result);?? }??
(3)scanimagemagick.h
[html]?view plaincopy
#ifndef?SCANIMAGEMAGICK_H?? #define?SCANIMAGEMAGICK_H?? #include?<iostream>?? #include?<Magick++.h>?? #include?<zbar.h>?? #define?STR(s)?#s?? /*****************?? ?*?yum?install?ImageMagick?? ?***********/?? using?namespace?std;?? using?namespace?zbar;?? ?? int?scanimagemagick?(const?char?*filename,?char?*result);?? ?? #endif?//?SCANIMAGE_H??
(4)scanimagemagick.cpp
[html]?view plaincopy
#include?<stdio.h>?? #include?<stdlib.h>?? #include?<string.h>?? #include?"scanimagemagick.h"?? ?? int?scanimagemagick(const?char?*filename,?char?*result)?? {?? #ifdef?MAGICK_HOME?? ????//?http://www.imagemagick.org/Magick++/?? ????//????under?Windows?it?is?necessary?to?initialize?the?ImageMagick?? ????//????library?prior?to?using?the?Magick++?library?? ????Magick::InitializeMagick(MAGICK_HOME);?? #endif?? ?? ????//?create?a?reader?? ????ImageScanner?scanner;?? ?? ????//?configure?the?reader?? ????scanner.set_config(ZBAR_NONE,?ZBAR_CFG_ENABLE,?1);?? ?? ????//?obtain?image?data?? ????Magick::Image?magick(filename);??//?read?an?image?file?? ????int?width?=?magick.columns();???//?extract?dimensions?? ????int?height?=?magick.rows();?? ????Magick::Blob?blob;??????????????//?extract?the?raw?data?? ????magick.modifyImage();?? ????magick.write(&blob,?"GRAY",?8);?? ????const?void?*raw?=?blob.data();?? ?? ????//?wrap?image?data?? ????Image?image(width,?height,?"Y800",?raw,?width?*?height);?? ?? ????//?scan?the?image?for?barcodes?? ????int?n?=?scanner.scan(image);?? ?? ????//?extract?results?? ????for(Image::SymbolIterator?symbol?=?image.symbol_begin();?? ????????symbol?!=?image.symbol_end();?? ????????++symbol)?{?? ????????//?do?something?useful?with?results?? //????????cout?<<?"decoded?"?<<?symbol->get_type_name()?? //?????????????<<?"?symbol?\""?<<?symbol->get_data()?<<?'"'?<<?endl;?? ????????sprintf(result,?"%s:%s",?symbol->get_type_name().data(),?symbol->get_data().data());?? ????}?? ?? ????//?clean?up?? ????image.set_data(NULL,?0);?? ?? ????return(0);?? }??
(5)運行結果
??
(6)
源碼可從csdn上下載:http://download.csdn.net/detail/taiyang1987912/9001133
(7)提示
?????? 打開編譯選項DEFINES *= QRDECODE,則使用了ImageMagick,則需要安裝#yum install ImageMagick,并加入頭文件路徑/usr/include/ImageMagick/。若不是用
QRDECODE,用C庫,再識別有些png文件時會出現段錯誤。上述zbar有中文亂碼,可參考網上修改。
3、QZxing庫(識別二維碼)
??????? 從http://sourceforge.net/projects/qzxing/files/下載QZxing的decoding library的源碼,在工程中加入include(QZXing_sourceV2.3/QZXing.pri)。
(1)qrcondezxing.h
[html]?view plaincopy
#ifndef?QRCONDEZXING_H?? #define?QRCONDEZXING_H?? ?? #include?<QWidget>?? #include?<QTextCodec>?? #include?<QFileDialog>?? ?? namespace?Ui?{?? class?QRCondeZxing;?? }?? ?? class?QRCondeZxing?:?public?QWidget?? {?? ????Q_OBJECT?? ?? public:?? ????explicit?QRCondeZxing(QWidget?*parent?=?0);?? ????~QRCondeZxing();?? ?? private?slots:?? ????void?on_pushButton_clicked();?? ?? private:?? ????Ui::QRCondeZxing?*ui;?? };?? ?? #endif?//?QRCONDEZXING_H??
(2)qrcondezxing.cpp
[html]?view plaincopy
#include?"qrcondezxing.h"?? #include?"ui_qrcondezxing.h"?? #include?"QZXing.h"?? ?? QRCondeZxing::QRCondeZxing(QWidget?*parent)?:?? ????QWidget(parent),?? ????ui(new?Ui::QRCondeZxing)?? {?? ????QTextCodec?*codec?=?QTextCodec::codecForName("utf8");?? ????QTextCodec::setCodecForLocale(codec);?? ????QTextCodec::setCodecForCStrings(codec);?? ????QTextCodec::setCodecForTr(codec);?? ????ui->setupUi(this);?? }?? ?? QRCondeZxing::~QRCondeZxing()?? {?? ????delete?ui;?? }?? ?? void?QRCondeZxing::on_pushButton_clicked()?? {?? ????QString?fileName?=?QFileDialog::getOpenFileName(this,?tr("choose?a?picture"),?? ????????????????????????????????????????????????????QApplication::applicationDirPath(),?? ????????????????????????????????????????????????????tr("all?Files?(*.*)"));?? ????ui->lineEdit->setText(fileName);?? ????ui->label_3->setPixmap(QPixmap(ui->lineEdit->text()));?? ????QZXing?decoder;?? ????QString?qrmsg?=?decoder.decodeImageFromFile(ui->lineEdit->text());?? ????ui->textEdit->setText(qrmsg);?? }??
(3)運行結果:
?
(4)源碼可從csdn上下載:http://download.csdn.net/detail/taiyang1987912/8991903。
三、條形碼/二維碼開源軟件
(1)二維碼掃描工具和開發包ZBar
??????? ZBar是款桌面電腦用條形碼/二維碼掃描工具,支持攝像頭及圖片掃描,支持多平臺包括 iPhone 手機。同時 ZBar 提供了二維碼掃描的 API 開發包。 ZBar 目前支持掃描,除了 Windows 平臺外,還支持 Linux 及 iPhone 平臺。網址:http://zbar.sourceforge.net。
(2)C語言二維條形碼解析庫libqrencode
??????? libqrencode (QRencode) 是一個用C語言編寫的用來解析二維條形碼(QR Code)的程序庫,libqrencode通過手機的CCD攝像頭來掃描二維條形碼。網址:http://zbar.sourceforge.net。
(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。網址:http://sourceforge.net/projects/qzxing。
?????? 其他參考:http://www.oschina.net/project/tag/238/barcode
http://www.oschina.net/project/tag/238/barcode?lang=21&sort=v-
四、總結
(1)二維碼和條形碼的開源軟件種類很多,可針對C、Java、ios等不同接口來選擇自己的需求。
(2)二維碼的庫在中文方面的也是有支持的。
(3)源碼使用中僅僅進行了簡單的調用,沒有實現更深層次的開發,主要是自己沒有項目需求,其他的開發讀者可繼續開發。
(4)若有建議,請留言,在此先感謝!
總結
以上是生活随笔為你收集整理的Qt浅谈之三十二二维码条形码解析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。