2018-02-20 00:30:26  更新:推荐新扩展(极力推荐

这篇文章里用的两个二维码扩展都有些问题和麻烦:phpqrcode(生成二维码)的源码有点小 bug; 而 php-zbarcode(识别二维码)需要其他开源套件和扩展模块的支持,编译起来很容易出问题,只支持 php5,而且 3 年多没维护,目测作者已放弃。对于不爱折腾开发环境的人太不方便。在 github 找到两个扩展,本人推荐:

  1. endroid/qrcode: 生成二维码,第三方包,支持 Composer。ReadMe 里有简明的 Demo,可以快速上手。不再另说了。
  2. php-qrcode-detector-decoder: 识别二维码,第三方包,支持 Composer。只需要 php5.6 以上和 GD 库支持。ReadMe 里也有简明的 Demo,可以快速上手。不再另说。

2018-02-04 23:28:30 更新:使用 apt 安装 zbar

编译安装 zbar 还是有毛病,很容易出问题。Ubuntu 官方源有个 zbar-tools,也就是 zbar。推荐朋友们用 apt 安装,一条命令搞定:

sudo apt-get install zbar-tools

我的系统是 Ubuntu 17.10.1,官方源有 zbar-tools,所以直接装了。装好 zbar 之后就可以使用 zbarimg path/to/your_qrcode.png 识别二维码了。如果你的 ppa 源里没有 zbar-tools、并且也没找到其他可用的ppa,那还是按照本文的 “六、安装 zbar” 部分尝试编译安装吧。

一、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 生成 qr code 二维码

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:forrestgump@walladalla.com
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:name@example.com
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:name@example.com'.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 读取条形码的扩展模块,目前仅支持 php5.x。使用这个模块之前还需要安装 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/
./configure
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
make
sudo make install
sudo ldconfig /usr/local/lib
magick --version

********************************************* 常见错误 *******************************************

出错1:安装好以后使用 magick 、 convert 等相关命令时,加载动态链接库出错

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/
phpize
./configure --with-php-config=/usr/bin/php-config
make
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 扩展,编辑 /etc/php/5.6/apache2/php.ini 文件

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

最后添加一行

extension=zbarcode.so

重启 apache

sudo /etc/init.d/apache2 restart

这就好了,可以使用条形码扩展了。

注意 php -m 命令显示的是 php-cli 模式启用的扩展,要让 php-cli 模式也启用扩展的话,需要再编辑 cli 模式的配置文件。在 /etc/php/5.6/cli/php.ini 里,最后添加一行

extension=zbarcode.so

然后就能使用 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:name@example.com
REV:20171201T005548Z
END:VCARD

九、参考链接

PHP 生成、识别二维码及安装相关扩展/工具的更多相关文章

  1. Pyqt+QRcode 生成 识别 二维码

    1.生成二维码 python生成二维码是件很简单的事,使用第三方库Python QRCode就可生成二维码,我用Pyqt给QRcode打个壳 一.python-qrcode介绍 python-qrco ...

  2. python小工具myqr生成动态二维码

    python小工具myqr生成动态二维码 (一)安装 (二)使用 (一)安装 命令: pip install myqr 安装完成后,就可以在命令行中输入 myqr 查看下使用帮助: myqr --he ...

  3. python实现树莓派生成并识别二维码

    python实现树莓派生成并识别二维码 参考来源:http://blog.csdn.net/Burgess_Liu/article/details/40397803 设备及环境 树莓派2代 官方系统R ...

  4. Python3+qrcode+zxing生成和识别二维码教程

    一.安装依赖库 pip install qrcode pillow image zxing pillow是python3中PIL的代替库,image是生成图版需要用到的库 安装image时报错“Cou ...

  5. day111:MoFang:邀请好友流程&生成邀请好友二维码&第三方应用识别二维码&本地编译测试&记录邀请人信息

    目录 1.邀请业务逻辑流程图 2.邀请好友-前端 3.邀请好友-后端接口(生成二维码) 4.前端获取后端生成的二维码 5.前端长按页面,保存图片到相册 6.客户端通过第三方识别微信二维码,服务端提供对 ...

  6. HTML5实现扫描识别二维码/生成二维码

    扫描识别二维码 思路: 1. 操作摄像头,获取图片.HTML5 WEBRTC的navigator.getUserMedia方法去实时获取摄像头资源.  2. 利用canvas使用相关算法分析图片识别图 ...

  7. C# ZXing.Net生成二维码、识别二维码、生成带Logo的二维码(二)

    1.使用ZXint.Net生成带logo的二维码 /// <summary> /// 生成带Logo的二维码 /// </summary> /// <param name ...

  8. 使用ZXing.Net生成与识别二维码(QR Code)

    Google ZXing是目前一个常用的基于Java实现的多种格式的1D/2D条码图像处理库,出于其开源的特性其现在已有多平台版本.比如今天要用到的ZXing.Net就是针对微软.Net平台的版本.使 ...

  9. C#生成和识别二维码

    用到外部一个DLL文件(ThoughtWorks.QRCode.dll),看效果 生成截图 识别截图 生成二维码后右键菜单可以保存二维码图片,然后可以到识别模式下进行识别,当然生成后可以用手机扫描识别 ...

随机推荐

  1. BZOJ5089 最大连续子段和(分块)

    假设所有操作都是对整个序列的.考虑每个子区间,区间和与其被加的值构成一次函数关系.最大子段和相当于多个子区间取最大值,答案显然就在这些一次函数构成的下凸壳上.如果预处理出凸壳,只要在凸壳上暴力跳就可以 ...

  2. BZOJ 3498 PA2009 Cakes

    本题BZOJ权限题,但在bzojch上可以看题面. 题意: N个点m条无向边,每个点有一个点权a. 对于任意一个三元环(i,j,k)(i<j<k),它的贡献为max(ai,aj,ak) 求 ...

  3. STL Queue 容器

    STL Queue 容器 Queue简介         queue是队列容器,是一种“先进先出”的容器.         queue是简单地装饰deque容器而成为另外的一种容器.        # ...

  4. [LOJ2271] [SDOI2017] 遗忘的集合

    题目链接 LOJ:https://loj.ac/problem/2271 洛谷:https://www.luogu.org/problemnew/show/P3784 BZOJ太伤身体死活卡不过还是算 ...

  5. 【codeforces 235E】 Number Challenge

    http://codeforces.com/problemset/problem/235/E (题目链接) 题意 给出${a,b,c}$,求${\sum_{i=1}^a\sum_{j=1}^b\sum ...

  6. Compile、Make和Build的区别(as make, build, clean, run)

    Compile.Make和Build的区别 - 熔 岩 - 51CTO技术博客 http://lavasoft.blog.51cto.com/62575/436216/ 针对Java的开发工具,一般都 ...

  7. bzoj3533【Sdoi2014】向量集

    题目描述 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);" Q x y l r (|x|,|y| &l ...

  8. 【bzoj3832】Rally

    Portal -->bzoj3832 Description ​ 给你一个DAG,每条边长度都是\(1\),请找一个点满足删掉这个点之后剩余图中的最长路最短 Solution ​​ 这题的话感觉 ...

  9. git 利用hook 实现服务器自动更新代码

    如何利用git的hook实现提交代码后自动更新? 因为个人开发经常需要提交代码,每次都需要连接服务器去pull代码,重启服务器就显得十分繁琐,因此github提供了一个时间钩子,用户push代码后可以 ...

  10. Java入门:基础算法之从字符串中找到重复的字符

    本程序演示从一个字符串中找出重复的字符,并显示重复字符的个数. import java.util.HashMap; import java.util.Map; import java.util.Set ...