【问题标题】:Read/decode bar codes from an image in php从 php 中的图像读取/解码条形码
【发布时间】:2015-10-05 06:13:15
【问题描述】:

我正在考虑构建一个 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 等价物?

【问题讨论】:

  • This 可能会有所帮助

标签: javascript php html barcode


【解决方案1】:

根据我的经验,ZBAR 是我经过长期研究和多次尝试使用其他免费选项(包括 BarBara)后发现的最好的。只需下载并安装 ZBar(取决于您的操作系统)并运行 PHP 的 exec 命令。窗口示例:

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

print_r($result);

我在 10.000 多张多种格式(jpg、gif、png 和 bmp)的大图像中运行 ZBar,它成功检测到其中大约 70% 的条形码。它可以读取多种条码格式,包括 EAN-13、QR-Code 等,并且可以读取同一图像中的多个条码。绝对值得一试!

【讨论】:

  • 我没有投反对票。然而,70% 的准确率非常糟糕。
  • @James 不一定是老兄,70% 的 10,000 多张图像在旧纸上用粘合剂和条形码上的东西扫描在我的情况下是一个很好的比率!它们是旧的 DVD 盒。如果你得到完美扫描的图像,如果你按照我上面的回答,这个比率将接近 100%!
  • 好的,我没有意识到您正在扫描的条形码已损坏/覆盖了一半。
  • 但是,我有一个 code39 条形码,它是由我拥有的其他代码生成的 PDF(如此清晰),我从中生成了 JPG 图像。它说,它在图像中根本找不到条形码。虽然它确实适用于我拥有的二维码。其他条码扫描器可以读取条码就好了。
  • 好吧,让我收回。我生成了一个新的 JPG,留下 ONLY 条形码(周围没有空格),然后它就可以读取它了。然后我再次扩大了图像,只填充了一个白色背景,现在它似乎工作得很好。
【解决方案2】:

使用 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);

【讨论】:

    【解决方案3】:

    通过结合使用 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);
    

    【讨论】:

      猜你喜欢
      • 2013-11-21
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      相关资源
      最近更新 更多