生活随笔
收集整理的這篇文章主要介紹了
Qt浅谈之三十二二维码条形码解析
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)自:Qt淺談之三十二二維碼條形碼解析
一、簡(jiǎn)介
??????? 二維條碼/二維碼(2-dimensional bar code)是用某種特定的幾何圖形按一定規(guī)律在平面(二維方向上)分布的黑白相間的圖形記錄數(shù)據(jù)符號(hào)信息的,其應(yīng)用廣泛,如:產(chǎn)品防偽/溯源、廣告推送、網(wǎng)站鏈接、數(shù)據(jù)下載、商品交易、定位/導(dǎo)航、電子憑證、車(chē)輛管理、信息傳遞、名片交流、wifi共享等。
???? 一維碼是用條空在水平方向上表達(dá)信息的條碼,外形更接近矩形;二維碼可以說(shuō)是正方形,在其內(nèi)部有三個(gè)“回”字型的定位點(diǎn),可以幫助條碼設(shè)備對(duì)焦,便于讀取數(shù)據(jù)。一維碼的信息部分只能是字母和數(shù)字,它的數(shù)據(jù)容量較小一般只可容納30個(gè)字符左右。二維碼的信息承載量很大,最大數(shù)據(jù)含量可達(dá)1850個(gè)字符,信息內(nèi)容可包含,字母,數(shù)字,漢字,字符,片假名等。一維碼的常用碼制包括:EAN碼、39碼、交叉25碼、UPC碼、128碼、93碼,ISBN碼,及Codabar(庫(kù)德巴碼)等;二維碼常用的碼制有:PDF417二維條碼,Datamatrix二維條碼,QR Code,Code 49,Code 16K,Code one等。
二、詳解
1、libqrencode庫(kù)(生成二維碼)
(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)運(yùn)行
???????????
?????? 也可是使用QrenCode 的命令行工具生成二維碼,在centos6.6下執(zhí)行#?yum install qrencode(或下載qrencode-3.4.4.tar.gz使用./configure、make、make install安裝);使用qrencode -o output.png https://www.baidu.com/即可在當(dāng)前目錄下生成百度的二維碼圖片output.png;若想自定義尺寸的話,加上 -s 參數(shù),比如 -s 6 表示尺寸為 6x6 平方像表大小,qrencode -s 6 -o output.png https://www.baidu.com/。命令行下識(shí)別二維碼的是#yum install libdecodeqr-examples,libdecodeqr-simpletest <二維碼圖片>。安裝zbar-0.10.tar.bz2,也可一識(shí)別二維碼。
??????
(5)源碼可從csdn上下載:http://download.csdn.net/detail/taiyang1987912/8991975。
2、zbar庫(kù)(識(shí)別二維碼)
????? 下載http://sourceforge.net/projects/zbar/files/?source=navbar的源碼:zbar-0.10.tar.bz2,執(zhí)行./configure和make和make install安裝zbar,默認(rèn)安裝頭文件在/usr/local/include下,庫(kù)文件在/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)運(yùn)行結(jié)果
??
(6)
源碼可從csdn上下載:http://download.csdn.net/detail/taiyang1987912/9001133
(7)提示
?????? 打開(kāi)編譯選項(xiàng)DEFINES *= QRDECODE,則使用了ImageMagick,則需要安裝#yum install ImageMagick,并加入頭文件路徑/usr/include/ImageMagick/。若不是用
QRDECODE,用C庫(kù),再識(shí)別有些png文件時(shí)會(huì)出現(xiàn)段錯(cuò)誤。上述zbar有中文亂碼,可參考網(wǎng)上修改。
3、QZxing庫(kù)(識(shí)別二維碼)
??????? 從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)運(yùn)行結(jié)果:
?
(4)源碼可從csdn上下載:http://download.csdn.net/detail/taiyang1987912/8991903。
三、條形碼/二維碼開(kāi)源軟件
(1)二維碼掃描工具和開(kāi)發(fā)包ZBar
??????? ZBar是款桌面電腦用條形碼/二維碼掃描工具,支持?jǐn)z像頭及圖片掃描,支持多平臺(tái)包括 iPhone 手機(jī)。同時(shí) ZBar 提供了二維碼掃描的 API 開(kāi)發(fā)包。 ZBar 目前支持掃描,除了 Windows 平臺(tái)外,還支持 Linux 及 iPhone 平臺(tái)。網(wǎng)址:http://zbar.sourceforge.net。
(2)C語(yǔ)言二維條形碼解析庫(kù)libqrencode
??????? libqrencode (QRencode) 是一個(gè)用C語(yǔ)言編寫(xiě)的用來(lái)解析二維條形碼(QR Code)的程序庫(kù),libqrencode通過(guò)手機(jī)的CCD攝像頭來(lái)掃描二維條形碼。網(wǎng)址:http://zbar.sourceforge.net。
(3)條形碼掃描軟件 Zebra barcode reader
??????? Zebra barcode reader是一個(gè)小型的,分層次的條形碼掃描軟件。它支持許多流行的條碼符號(hào):EAN,UPC,128碼,39碼等。能抓獲條碼解碼圖像和使用視頻設(shè)備(如攝像頭)作為一個(gè)條形碼掃描儀。
(4)QZXing
?????? Qt包裝ZXing的解碼庫(kù)。ZXing是條形碼處理類(lèi)庫(kù),它是一個(gè)開(kāi)源Java類(lèi)庫(kù)用于解析多種格式的1D/2D條形碼。目標(biāo)是能夠?qū)R編碼、Data Matrix、UPC的1D條形碼進(jìn)行解碼。 其提供了多種平臺(tái)下的客戶(hù)端包括:J2ME、J2SE和Android。網(wǎng)址: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-
四、總結(jié)
(1)二維碼和條形碼的開(kāi)源軟件種類(lèi)很多,可針對(duì)C、Java、ios等不同接口來(lái)選擇自己的需求。
(2)二維碼的庫(kù)在中文方面的也是有支持的。
(3)源碼使用中僅僅進(jìn)行了簡(jiǎn)單的調(diào)用,沒(méi)有實(shí)現(xiàn)更深層次的開(kāi)發(fā),主要是自己沒(méi)有項(xiàng)目需求,其他的開(kāi)發(fā)讀者可繼續(xù)開(kāi)發(fā)。
(4)若有建議,請(qǐng)留言,在此先感謝!
總結(jié)
以上是生活随笔為你收集整理的Qt浅谈之三十二二维码条形码解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。