读取/解码条形码从一个图像在php


Read/decode bar codes from an image in php

我正在考虑建立一个13位EAN条形码扫描仪,该扫描仪可在移动设备上的网络上工作,并将使用设备相机拍摄条形码图像进行扫描和解码。我并不打算通过原生应用来实现这一点,因为我更希望将其作为原生网站搜索体验的一部分。例如,手机上的网站访问者将被提示扫描条形码,而无需打开应用程序。

此脚本在桌面https://github.com/EddieLa/JOB上运行良好,并使用Navigator。getUserMedia属性可以在JavaScript中完成所有这些,但是Android支持才刚刚开始,IOS支持还不存在http://caniuse.com/#feat=stream

所以我想知道我是否可以相反,支持移动设备,这是我正在尝试做的全部要点,而不是在浏览器中读取条形码,拍摄条形码的照片,通过Ajax将其发送到服务器,让服务器解码图像并将响应发送回网页。

有了这种方法,我知道有python脚本可以读取条形码,如https://pypi.python.org/pypi/zbar,但是有PHP等价物吗?

从我的经验来看ZBAR是我经过长时间的研究和许多其他可用的免费选项的尝试后发现的最好的一个,包括BarBara。只需下载并安装ZBar(取决于您的操作系统)并运行PHP的exec命令。Windows的例子:

exec('C:''"Program Files (x86)"''ZBar''bin''zbarimg -q C:''path''img.jpg', $result);
print_r($result);

我以多种格式(jpg, gif, png &Bmp),它成功地检测出了大约70%的条形码。它可以读取多种条形码格式,包括EAN-13, QR-Code等,并可以在同一图像中读取多个条形码。绝对值得一试!

使用BarBara条形码库:

官方网站:http://sourceforge.net/projects/barbara

下载php源代码:http://sourceforge.net/projects/barbara/files/BarBara%20Source/PHP5/barbara.zip/download

测试:

error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once "barcode.php";
$bc = new barcode;
$scanner = new BarScan;
$bc->load("barcode.js");
echo "Dictionary Loaded..";

$scanner->Codecs = $bc;
echo "Test";
//Manually set code type
$scanner->CodeType = $bc->code39;
$img = new Imagick("test/code-25.gif");
echo "Image Loaded...";
echo "<br />Decoded: " . $scanner->Scan($img, 0, 20, 2048, 0);

通过使用php库imagick结合zbar和composer库"robbiep/zbar-qrdecoder": "^2.0",我能够获得更好的读取条形码的结果。代码如下,并删除了可能在条形码后面并阻碍其识别的灰度。干杯!

        $blankAndWhiteFileName = time()."-".rand();
        $imagick = new Imagick($file);
        $imagick->modulateImage(100, 0, 100);
        $imagick->whiteThresholdImage('#a9a9a9');
        $imagick->contrastImage(1);
        $imagick->setImageFormat('jpg');
        $tempFilename = tempnam('/tmp', $blankAndWhiteFileName);
        $blackAndWhite = $imagick->writeImage($tempFilename);
        $ZbarDecoder = new RobbieP'ZbarQrdecoder'ZbarDecoder();
        $result = $ZbarDecoder->make($tempFilename);
        unlink($tempFilename);