1. 程式人生 > >PHP 生成、識別二維碼

PHP 生成、識別二維碼

play github 開源軟件 eve tps sage compose example 電子郵件

溫馨提示:經過這 2 天的折騰,我卸載了 php7.1。原因只有一個——我要安裝的條形碼擴展模塊 php-zbarcode 的 c 語言源代碼不支持 php7。改源代碼改了半天,還是沒奏效。最後看 github 上一個溫馨的 issue 換回了 php5.6。這下裝起來順利多了~話不多說,正題開始。

一、php 生成 qr code 二維碼

phpqrcode 是由 php 編寫的、可以生成 QR Code 二維碼的第三方包。官網有很多例子可以參考,使用起來很簡單,2 行代碼。

<?php
// 1. 使用官網包
require ‘./phpqrcode/qrlib.php‘;

QRcode::png(‘http://github.com‘, ‘qrcode.png‘, QR_ECLEVEL_L, 8, 4, false);

// 該方法的最後一個參數有Bug,寫 TRUE 時(保存並打印)並不會打印顯示,需要修改源碼
// QRcode::png(‘123‘, ‘./qrcode.png‘, QR_ECLEVEL_L, 4, 4, TRUE);

// 2. 使用composer包
// aferrandini/phpqrcode 這個包在packagist.org上排名第一,是根據官網打包的,不過Bug似乎也好好的在那兒~~。
// 其他類似的composer包還有很多,按需求找吧~~

二、jquery 生成 qrcode 二維碼

jquery.qrcode.js 是前端生成 QR Code 二維碼的插件庫。下面是我參考 jquery.qrcode.js 在 github 倉庫上一個 example 寫的。看代碼。

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>QR Code</title>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
	<script type="text/javascript" src="./js/jquery.qrcode.js"></script>
	<script type="text/javascript" src="./js/qrcode.js"></script>
</head>

<body>
	<p>快速渲染:</p>
	<div id="qrcode"></div>
	<p>table渲染:</p>
	<div id="qrcodeTable"></div>
	<p>canvas渲染:</p>
	<div id="qrcodeCanvas"></div>
	<p>設置寬高:</p>
	<div id="qrcodeResize"></div>

	<!-- -------------------------------------------------------- -->
	<script>
		// 快速渲染
		$(‘#qrcode‘).qrcode("http://github.com");
		// table渲染
		$(‘#qrcodeTable‘).qrcode({
			render	: "table",
			text	: "http://github.com"
		});	
		// canvas渲染
		$(‘#qrcodeCanvas‘).qrcode({
			render  : "canvas",
			text	: "http://github.com"
		});
		// 設置寬高
		$(‘#qrcodeResize‘).qrcode({
			width   : 128,
			height  : 128,
			text	: "http://github.com"
		});
	</script>
</body>
</html>

然後瀏覽器訪問這個頁面,就能看到 4 個二維碼了。

註意一下:

  1. 總之,現在記下這篇文檔的時候,按照官網和 github 還有其他一些博客上的說明都只加載了 jquery.qrcode.js (query.js 除外),但是只加載這一個 jQ 的話我這裏行不通,必須再加載 qrcode.js
  2. jQ 生成 QR Code 的代碼必需在容器元素後面,可以放在 <body> 標簽內最後。如果放在<head>標簽中也生不出來 QR Code。這是 github上的一個例子。

三、php 生成電子名片

1. vCard

vCard 是電子名片的文件格式標準。它一般附加在電子郵件之後,但也可以用於其它場合(如在互聯網上相互交換)。vCard 可包含的信息有:姓名、地址資訊、電話號碼、URL,logo,相片等(摘自維基百科)。

2. 樣例

下面是一個包含個人信息的 vCard 格式電子名片(摘自維基百科),可以參照它來修改:

BEGIN:VCARD
VERSION:2.1
N:Gump;Forrest
FN:Forrest Gump
ORG:Gump Shrimp Co.
TITLE:Shrimp Man
TEL;WORK;VOICE:(111) 555-1212
TEL;HOME;VOICE:(404) 555-1212
ADR;WORK:;;100 Waters Edge;Baytown;LA;30314;United States of America
LABEL;WORK;ENCODING=QUOTED-PRINTABLE:100 Waters Edge=0D=0ABaytown, LA 30314=0D=0AUnited States of America
ADR;HOME:;;42 Plantation St.;Baytown;LA;30314;United States of America
LABEL;HOME;ENCODING=QUOTED-PRINTABLE:42 Plantation St.=0D=0ABaytown, LA 30314=0D=0AUnited States of America
EMAIL;PREF;INTERNET:[email protected]
REV:20080424T195243Z
END:VCARD

參考上面的 vCard 樣例,可以制作個人的電子名片。具體的各個字段解釋可以參考百度百科上的 vCard 介紹。

3. php 生成電子名片

照樣子寫一個,使用 phpqrcode 包來生成我的電子名片:

<?php
// 使用 phpqrcode 生成電子名片

require ‘./phpqrcode/qrlib.php‘;

$vcard = <<<EOL
BEGIN:VCARD
VERSION:2.1
N:Jin;mingc
FN:mingc
ORG:free man
TITLE:PHPer
TEL;WORK;VOICE:1382173xxxx
TEL;HOME;VOICE:1383284xxxx
ADR;WORK;TianJin, China
LABEL;WORK;ENCODING=QUOTED-PRINTABLE:TianJin, China(LABEL;WORK)
ADR;HOME;TianJin, China
LABEL;HOME;ENCODING=QUOTED-PRINTABLE:TianJin, China(LABEL;HOME)
EMAIL;PREF;INTERNET:[email protected]
REV:20171201T005548Z
END:VCARD
EOL;

QRcode::png($vcard);

// define(‘EOL‘, "\r\n");

// $vcard  = ‘BEGIN:VCARD‘.EOL;
// $vcard .= ‘VERSION:2.1‘.EOL;
// $vcard .= ‘N:Jin;mingc‘.EOL;
// $vcard .= ‘FN:mingc‘.EOL;
// $vcard .= ‘ORG:free man‘.EOL;
// $vcard .= ‘TITLE:PHPer‘.EOL;
// $vcard .= ‘TEL;WORK;VOICE:1382173xxxx‘.EOL;
// $vcard .= ‘TEL;HOME;VOICE:1383284xxxx‘.EOL;
// $vcard .= ‘ADR;WORK;TianJin, China‘.EOL;
// $vcard .= ‘LABEL;WORK;ENCODING=QUOTED-PRINTABLE:TianJin, China(LABEL;WORK)‘.EOL;
// $vcard .= ‘ADR;HOME;TianJin, China‘.EOL;
// $vcard .= ‘LABEL;HOME;ENCODING=QUOTED-PRINTABLE:TianJin, China(LABEL;HOME)‘.EOL;
// $vcard .= ‘EMAIL;PREF;INTERNET:[email protected]‘.EOL;
// $vcard .= ‘REV:20171201T005548Z‘.EOL;
// $vcard .= ‘END:VCARD‘;

// QRcode::png($vcard);

瀏覽器訪問這個 php 腳本會顯示一張二維碼,微信掃一掃,結果如下:

技術分享圖片

這個電子名片還可以直接添加到你的手機聯系人裏。

四、php 識別二維碼(工具)

php 識別二維碼或條形碼需要 3 個工具。

1. ImageMagick

ImageMagick 是一個用於查看、編輯位圖文件以及進行圖像格式轉換的開放源代碼軟件套裝。它可以讀取、編輯超過 100 種圖象格式。ImageMagick 以 ImageMagick 許可證(一個類似 BSD 的許可證)發布。

2. zbar

zbar 是一個開源軟件套件,用於讀取各種來源的條形碼,如視頻流,圖像文件和原始強度傳感器。它支持 包括 EAN-13 / UPC-A,UPC-E,EAN-8,Code 128,Code 39,Interleaved 2 of 5 和 QR Code 等多種流行的條碼。

3. php-zbarcode

php-zbarcode 是 PHP 讀取條形碼的擴展模塊。使用這個模塊之前還需要安裝 ImageMagick 和 zbar 這兩個命令行套件。

phpzbarcode 依賴於 ImageMagick 和 zbar,zbar 依賴於 ImageMagick,ImageMagick 依賴 jpeg 庫來提供 jpeg 圖片支持,所以先安裝 jpeg 支持。

安裝 jpeg 庫

下載地址:http://www.imagemagick.org/download/delegates/我下載的包名為 jpegsrc.v9b.tar.gz

wget http://www.imagemagick.org/download/delegates/jpegsrc.v9b.tar.gz
tar xf jpegsrc.v9b.tar.gz
cd jpeg-9b/
make
sudo make install

五、安裝 ImageMagick

下載地址:https://www.imagemagick.org/download/,我下載的包名為 ImageMagick.tar.gz

wget https://www.imagemagick.org/download/ImageMagick.tar.gz
tar xf ImageMagick.tar.gz
cd ImageMagick-7.0.7-13
./configure
sudo make
sudo make install
sudo ldconfig /usr/local/lib
magick --version

********************************************* 常見錯誤 *******************************************

出錯1:安裝好以後使用相關命令 magickconvert 等等時,加載動態鏈接庫出錯

convert: error while loading shared libraries: libMagickCore-7.Q16HDRI.so.4: cannot open shared object file: No such file or directory

解決方法:動態加載動態鏈接庫

sudo ldconfig /usr/local/lib

然後就可以正常使用命令行接口了。

六、安裝 zbar

下載地址:https://sourceforge.net/projects/zbar/files/zbar/。我下載的最新版 0.10,包名為 zbar-0.10.tar.gz

tar xf zbar-0.10.tar.gz
cd zbar-0.10/
sudo ln -s /usr/local/include/ImageMagick-7 /usr/local/include/ImageMagick
sudo ln -s /usr/local/include/ImageMagick-7/MagickWand /usr/local/include/wand
./configure --disable-video --without-gtk --without-qt --without-python 
make
make
sudo make install
zbarimg --version

********************************************* 常見錯誤 ********************************************

出錯1:找不到 MagickWand.h 頭文件

ImageMagick package found but wand/MagickWand.h not installed?!
-this is a problem with your ImageMagick install,
-please resolve the inconsistency and try again...

解決方法:zbar 的配置文件 ./configure 在運行時會找不到 MagickWand.h,它在 /usr/local/include/ImageMagick-7/MagickWand 目錄下,但是 ./configure 執行時會去 wand/ 目錄找(找不到),所以需要做兩個軟連接讓 ./configure 能找到 MagickWand.h 文件

sudo ln -s /usr/local/include/ImageMagick-7 /usr/local/include/ImageMagick
sudo ln -s /usr/local/include/ImageMagick-7/MagickWand /usr/local/include/wand

出錯2:make 編譯期間多處 warning 和 error

zbar/decoder/ean.c: In function ‘ean_part_end4’:
zbar/decoder/ean.c:245:13: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
     if(!par == fwd) {
             ^~
zbar/decoder/ean.c:245:8: note: add parentheses around left hand side expression to silence this warning
     if(!par == fwd) {
        ^~~~
        (   )
zbar/decoder/ean.c: In function ‘ean_part_end7’:
zbar/decoder/ean.c:294:13: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
     if(!par == fwd) {
             ^~
zbar/decoder/ean.c:294:8: note: add parentheses around left hand side expression to silence this warning
     if(!par == fwd) {
        ^~~~
        (   )

zbar/qrcode/qrdec.c: In function ‘qr_finder_quick_crossing_check’:
zbar/qrcode/qrdec.c:1215:27: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
   if(!_img[_y0*_width+_x0]!=_v||!_img[_y1*_width+_x1]!=_v)return 1;
                           ^~
zbar/qrcode/qrdec.c:1215:6: note: add parentheses around left hand side expression to silence this warning
   if(!_img[_y0*_width+_x0]!=_v||!_img[_y1*_width+_x1]!=_v)return 1;
      ^~~~~~~~~~~~~~~~~~~~~
      (                    )
zbar/qrcode/qrdec.c:1215:54: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
   if(!_img[_y0*_width+_x0]!=_v||!_img[_y1*_width+_x1]!=_v)return 1;
                                                      ^~
zbar/qrcode/qrdec.c:1215:33: note: add parentheses around left hand side expression to silence this warning
   if(!_img[_y0*_width+_x0]!=_v||!_img[_y1*_width+_x1]!=_v)return 1;
                                 ^~~~~~~~~~~~~~~~~~~~~
                                 (                    )
zbar/qrcode/qrdec.c:1216:45: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
   if(!_img[(_y0+_y1>>1)*_width+(_x0+_x1>>1)]==_v)return -1;
                                             ^~
zbar/qrcode/qrdec.c:1216:6: note: add parentheses around left hand side expression to silence this warning
   if(!_img[(_y0+_y1>>1)*_width+(_x0+_x1>>1)]==_v)return -1;
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      (                                      )
zbar/qrcode/qrdec.c: In function ‘qr_finder_locate_crossing’:
zbar/qrcode/qrdec.c:1257:33: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
     if(!_img[x0[1]*_width+x0[0]]!=_v)break;
                                 ^~
zbar/qrcode/qrdec.c:1257:8: note: add parentheses around left hand side expression to silence this warning
     if(!_img[x0[1]*_width+x0[0]]!=_v)break;
        ^~~~~~~~~~~~~~~~~~~~~~~~~
        (                        )
zbar/qrcode/qrdec.c:1269:33: warning: logical not is only applied to the left hand side of comparison [-Wlogical-not-parentheses]
     if(!_img[x1[1]*_width+x1[0]]!=_v)break;
                                 ^~
zbar/qrcode/qrdec.c:1269:8: note: add parentheses around left hand side expression to silence this warning
     if(!_img[x1[1]*_width+x1[0]]!=_v)break;
        ^~~~~~~~~~~~~~~~~~~~~~~~~
        (                        )

zbar/jpeg.c: In function ‘_zbar_convert_jpeg_to_y’:
zbar/jpeg.c:174:39: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
         cinfo->src->fill_input_buffer = fill_input_buffer;
                                       ^

解決方法:再次編譯

make

七、安裝 php-zbarcode

下載地址:https://github.com/mkoppanen/php-zbarcode

wget https://github.com/mkoppanen/php-zbarcode/archive/master.zip
unzip master.zip
cd php-zbarcode-master/ 
./configure --with-php-config=/usr/bin/php-config
make
sudo make install

成功後會提示安裝到的模塊目錄

mingc@mingc-GE60-2PL:~/Downloads/qrcode/php-zbarcode-master$ sudo make install 
Installing shared extensions:     /usr/lib/php/20131226/

確認模塊的位置

mingc@mingc-GE60-2PL:~/Downloads/qrcode/php-zbarcode-master$ ls /usr/lib/php/20131226/
build        dom.so       gettext.so   mcrypt.so     mysqli.so   pdo_mysql.so   posix.so      sockets.so  tokenizer.so  xmlwriter.so
bz2.so       exif.so      iconv.so     memcached.so  mysqlnd.so  pdo_odbc.so    readline.so   sqlite3.so  wddx.so       xsl.so
calendar.so  fileinfo.so  igbinary.so  memcache.so   mysql.so    pdo.so         redis.so      sysvmsg.so  xmlreader.so  zbarcode.so
ctype.so     ftp.so       json.so      mongo.so      odbc.so     pdo_sqlite.so  shmop.so      sysvsem.so  xmlrpc.so     zip.so
dba.so       gd.so        mbstring.so  msgpack.so    opcache.so  phar.so        simplexml.so  sysvshm.so  xml.so

可以看到有了 zbarcode.so 文件。

啟用 zbarcode 擴展,編輯 php.ini 文件

sudo vim /etc/php/5.6/apache2/php.ini

最後添加一行

extension=zbarcode.ini

重啟 apache

sudo /etc/init.d/apache2 restart

這就好了,可以使用條形碼擴展了。

註意 php -m 命令顯示的是 php-cli 模式啟用的擴展,要讓 php-cli 模式也啟用擴展的話,需要再編輯 cli 模式的 php.ini 文件, sudo vim /etc/php/5.6/cli/php.ini ,添加一行

extension=zbarcode.ini

然後就能使用 php -m 命令看到 zbarcode 模塊了。

八、php 識別二維碼

參照 github 上的 php-zbarcode 示例,識別一下我剛才生成的電子名片。

<?php
/* Create new image object */
$image = new ZBarCodeImage("./qrcode_vcard.png");

/* Create a barcode scanner */
$scanner = new ZBarCodeScanner();

/* Scan the image */
$barcode = $scanner->scan($image);

/* Loop through possible barcodes */
if (!empty($barcode)) {
	foreach ($barcode as $code) {
		printf("Found type %s barcode with data %s\n", $code[‘type‘], $code[‘data‘]);
	}
}

識別結果:

Found type QR-Code barcode with data BEGIN:VCARD
VERSION:2.1
N:Jin;mingc
FN:mingc
ORG:free man
TITLE:PHPer
TEL;WORK;VOICE:1382173xxxx
TEL;HOME;VOICE:1383284xxxx
ADR;WORK;TianJin, China
LABEL;WORK;ENCODING=QUOTED-PRINTABLE:TianJin, China(LABEL;WORK)
ADR;HOME;TianJin, China
LABEL;HOME;ENCODING=QUOTED-PRINTABLE:TianJin, China(LABEL;HOME)
EMAIL;PREF;INTERNET:[email protected]
REV:20171201T005548Z
END:VCARD

九、參考鏈接

  • https://gist.github.com/wacko/39ab8c47cbcc0c69ecfb
  • zbar wand/MagickWand.h not install_ImageMagick-7
  • Linux 系統上的 zbar 編譯安裝

PHP 生成、識別二維碼