前言
突然头脑风暴想写个识别二维码的接口,方便后续使用,所以就有了接下来的操作和踩坑。
思索一番,决定用PHP来实现,原因不必多解释,懂的都懂 ,所以就找了一下第三方扩展库,最开始找的是
php-zbarcode
的扩展,按照网上的安装步骤安装了 ImageMagick
和 zbar
但是后来吧,发现这玩意儿搞不懂,安装了没啥反应,又用宝塔面板在指定的PHP版本上进行了安装还是无果,最终还是以失败而告终。
接下来你们以为就结束了?NO 不可能,绝对不可能!又花了一个多小时检索然后就在万能的 CSDN 找到一篇文章,里面有具体的解释和使用教程(也可以看官方文档都差不多),作者与我开始是一样的同样使用了我的第一种办法,结果是一样的(心里舒坦多了 )
补充说明(重点
坑来了)
一开始觉得会很顺利的就可以实现,可终究我错了,经过试验它却疯狂报错。于是我又开始查阅资料,才知道是 空间命名 的问题(当我找到资料时也就反应过来了,当场直接裂开 )
- 原文中没有提及use空间命名问题(可能是我孤陋寡闻,知道的请跳过),只说
use PHPZxing\PHPZxingDecoder;
这样引入即可 - 但实际是,use空间命名的源文件,必须包含在当前PHP文件中,也就是说我们需要使用
require_once()
引入PHPZxingDecoder
这个文件 - 我们使用
composer
安装的扩展,安装好后vendor
目录下有一个autoload.php
文件,这个文件已经为我们引入了需要的文件,我们只需要将这个文件引入到index.php
中即可
<?php
require_once('vendor/autoload.php'); // 引入文件
use PHPZxing\PHPZxingDecoder;
$decoder = new PHPZxingDecoder();
?>
完整示例
<?php
require_once('vendor/autoload.php');
use PHPZxing\PHPZxingDecoder;
$config = array(
'try_harder' => true, // 当不知道二维码的位置的时候设置为true
'multiple_bar_codes' => false, // 当需要识别多个二维码的时候设为true
'possible_formats' => '' // 要解码的格式列表,其中格式是 BarcodeFormat(可百度,下面列出部分类型) 中的任何值
'crop' => '100,200,300,300' // 裁剪图像,它只会读取裁剪的部分,设置二维码的大概位置
);
$decoder = new PHPZxingDecoder($config);
$data = $decoder->decode('test2.jpg'); // 图片路径不能是Url
// 使用isFound()函数检查是否有二维码存在
if($data->isFound()){
echo json_encode(array(
'ImageValue'=>$data->getImageValue(),
'Format'=>$data->getFormat(),
'Type'=>$data->getType(),
'ImagePath'=>$data->getImagePath()
));
}else {
echo json_encode(array(
'ErrorCode'=>$data->getImageErrorCode(),
'ErrorMessage'=>$data->getErrorMessage(),
'ImagePath'=>$data->getImagePath()
));
}
?>
条形码/二维码类型列表
类型 | 注释 |
---|---|
CODE_128 | 表示高密度数据, 字符串可变长,符号内含校验码 |
CODE_39 | \ |
CODE_93 | \ |
CODABAR | 可表示数字0 - 9,字符$、+、 -、还有只能用作起始/终止符的a,b,c d四个字符,可变长度,无校验位 |
DATA_MATRIX | \ |
EAN_8 | \ |
EAN_13 | \ |
ITF | \ |
PDF417 | 二维码 |
QR_CODE | 二维码(常用) |
RSS_EXPANDED | \ |
RSS14 | \ |
UPC_E | 统一产品代码A:7位数字,最后一位为校验位 |
UPC_A | 统一产品代码A:12位数字,最后一位为校验位 |
UPC_EAN_EXTENSION | \ |
评论 (2)