二維碼是一個近幾年來移動設(shè)備上超流行的一種編碼方式皇帮,最早出現(xiàn)在20世紀(jì)20年代卷哩,到1988年才引入中國。現(xiàn)在属拾,日常生活中更是隨處可見将谊。它比傳統(tǒng)的Bar Code條形碼能存更多的信息,也能表示更多的數(shù)據(jù)類型渐白。它具有條碼技術(shù)的一些共性:每種碼制有其特定的字符集尊浓;每個字符占有一定的寬度;具有一定的校驗(yàn)功能等礼预。同時還具有對不同行的信息自動識別功能眠砾、及處理圖形旋轉(zhuǎn)變化點(diǎn)虏劲。
二維碼的優(yōu)點(diǎn)
- 高密度編碼托酸,信息容量大。(可容納多達(dá)1850個大寫字母或2710個數(shù)字或1108個字節(jié)柒巫,或500多個漢字励堡,比普通條碼信息容量約高幾十倍。)
- 編碼范圍廣堡掏。(可以把圖片应结、聲音、文字、簽字鹅龄、指紋等可以數(shù)字化的信息進(jìn)行編碼揩慕,用條碼表示出來;可以表示多種語言文字扮休;可表示圖像數(shù)據(jù)迎卤。)
- 容錯能力強(qiáng),具有糾錯功能玷坠。(因?yàn)槲蹞p等引起局部損壞時蜗搔,照樣可以正確得到識讀)
- 譯碼可靠性高。
- 可引入加密措施八堡。
- 成本低樟凄,易制作,持久耐用兄渺。
二維碼的缺點(diǎn)
- 二維碼成為 病毒缝龄,釣魚網(wǎng)站 傳播新的渠道
- 容易使自己信息泄露
環(huán)境檢查
$ uname -a
Linux TH-DEV 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
$ php -v
PHP 7.2.6 (cli) (built: Feb 13 2019 20:01:18) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
$ php -m | grep gd
gd
ImageMagick
ImageMagick 是一個用于查看、編輯位圖文件以及進(jìn)行圖像格式轉(zhuǎn)換的開放源代碼軟件套裝挂谍。它可以讀取二拐、編輯超過 100 種圖象格式。ImageMagick 以 ImageMagick 許可證(一個類似 BSD 的許可證)發(fā)布凳兵。
ImageMagick依賴圖片庫來提供圖片支持百新,所以需要先安裝圖片庫。
$ yum install -y libjpeg, libjpeg-devel, libpng, libpng-devel, libtiff, libtiff-devel, libgif, libgif-devel, freetype, zlib
CentOS安裝ImageMagick
$ yum install -y ImageMagick
$ yum install -y ImageMagick-devel
使用源碼包安裝禁止開啟多線程庐扫,增加參數(shù)–disable-openmp
關(guān)閉多線程饭望,降低負(fù)載。
查看安裝的版本
$ convert -version
Version: ImageMagick 6.7.8-9 2019-02-01 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC
Features: OpenMP
- Features的值為空或
DPC
形庭,說明是單線程铅辞。 - Features的值是
OpenMP
,說明是多線程萨醒。
刪除原始版本
$ yum remove ImageMagick
$ wget https://www.imagemagick.org/download/ImageMagick.tar.gz
$ tar zxvf ImageMagick
$ cd cd ImageMagick-7.0.8-59/
$ ./configure --enable-shared --enable-threads=posix --with-system-zlib --enable-__cxa_atexit --disable-openmp
$ make && make install
$ ldconfig /usr/local/lib
命令不存在
$ convert -version
convert command notfound
配置環(huán)境變量
$ vim /etc/profile
export ImageMagick_HOME=/usr/local/ImageMagick
export PATH=$PATH:$ImageMagick_HOME/bin
查看最新版本
$ convert -version
Version: ImageMagick 7.0.8-59 Q16 x86_64 2019-08-06 https://imagemagick.org
Copyright: ? 1999-2019 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI
Delegates (built-in): bzlib fontconfig freetype jng jpeg lzma png tiff x xml zlib
Imagick
ImageMagick的PHP擴(kuò)展是Imagick
CentOS安裝PHP得PECL
$ yum install -y php-pear
使用PHP的PECL安裝Imagick
$ pecl install imagick
$ pecl unstall imagick
查看PHP是否安裝Imagick擴(kuò)展
$ php -m | grep imagick
ZBar
ZBar 是一個開源軟件套件斟珊,用于讀取各種來源的條形碼,如視頻流富纸,圖像文件和原始強(qiáng)度傳感器囤踩。支持包括 EAN-13 / UPC-A,UPC-E晓褪,EAN-8堵漱,Code 128,Code 39涣仿,Interleaved 2 of 5 和 QR Code 等多種流行的條碼勤庐。
ZBar是一個開源庫示惊,用于掃描、讀取二維碼和條形碼愉镰,支持的二維碼包括EAN/UPC米罚、QR等。
CentOS安裝ZBar
$ yum install python-devel
$ yum install zbar-devel
$ pip install zbar
php-zbarcode
php-zbarcode是PHP讀取條形碼的擴(kuò)展模塊丈探,目前僅支持PHP5.x阔拳。我的PHP是7的版本,安裝不上去类嗤,直接放棄糊肠。
生成二維碼
QrCode
QrCode基于PHP的GD庫
$ composer require endroid/qr-code
例如:
function qrcode()
{
//獲取二維碼地址
$file = "/uploads/20190225/d66889aeab7850ac61b18c1bd81ac99e.png";
$qrcode = new QrReader($file);
$url = $qrcode->text();
//重新生成二維碼
$obj = new Qrcode();
$obj->setText($url);
$obj->setSize(300);
$obj->setLabel("推廣碼");
header("Content-Type:".$obj->getContentType());
$str = $obj->writeString();
die($str);
}
識別二維碼
qrcode-detector-decoder
qrcode-detector-decoder
包是基于谷歌開源的 zxing 實(shí)現(xiàn)的,需要 PHP >= 5.6遗锣、GD Library支持货裹。
$ composer require khanamiryan/qrcode-detector-decoder
識別二維碼返回地址
use Zxing\QrReader;
$qrcode = new QrReader('path/to_image');
$text = $qrcode->text(); //return decoded text from QR Code
錯誤:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes) in /vendor/khanamiryan/qrcode-detector-decoder/lib/IMagickLuminanceSource.php on line 60
## [1] ErrorExceptionin IMagickLuminanceSource.php line 60
Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes)
解決:默認(rèn)PHP配置文件php.ini
中內(nèi)存限制memory_limit = 128M
,給修改成memory_limit=512M
解決問題精偿。
ImageMagick 多線程(openMP)運(yùn)行時導(dǎo)致CPU暴增到100%
原因是由于新版本的 ImageMagick 啟用了OpenMP弧圆,默認(rèn)開啟多線程處理,導(dǎo)致cpu占用過高笔咽。查看convert -version
輸出內(nèi)容是否已經(jīng)開啟了多線程搔预,F(xiàn)eatures的值為空或DPC,說明是單線程叶组;如果Features的值是openMP拯田,說明是多線程。
$ convert -version
Version: ImageMagick 6.7.8-9 2019-02-01 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC
Features: OpenMP
方案:重新重新編譯ImageMagick最新版甩十,增加參數(shù): –disable-openmp關(guān)閉多線程船庇。
錯誤:
[ error ] [420]NoDecodeDelegateForThisImageFormat `/tmp/magick-nicdMfPB' @ error/constitute.c/ReadImage/544
解決:重新安裝PHP的Imagick擴(kuò)展
$ service php-fpm restart