tei187/qr-image2svg

将基于位图图像的二维码转换为SVG格式。

2.0.0 2024-08-14 07:51 UTC

This package is auto-updated.

Last update: 2024-10-03 08:31:43 UTC


README

QR image-2-svg converter

二维码图像2 SVG转换器

DEMO APP (目前用户体验不佳,界面杂乱,需要多次点击)

关于

库旨在轻松将基于位图图像的二维码转换为SVG等效格式。支持GD库、Imagick扩展和ImageMagick命令行提示。

原理

这里的原理是在二维码图像上分配一个网格,找到每个生成的瓦片的中心位置,并读取对应像素的颜色值。然后,根据指定的阈值值,根据收集到的数据解决SVG渲染。

背后的故事

创建此解决方案的主要原因是我的日常工作,我必须处理用于预press解决方案的图形文件。遗憾的是,许多图形设计师似乎仍然不理解,在印刷品中,位图图像的质量往往不如其矢量替代品,无论您将图像分辨率调得多高(这与RIP系统如何处理图像以转换为栅格点有关)。在我工作的公司,我们经常对图形文件进行修改,以获得最佳的印刷质量。然而,将二维码从位图转换为矢量对象并不像应该的那样简单或有趣(不,在许多情况下,轮廓追踪不是一个可行的选择),因此我们需要另一个内部解决方案来加快另一个流程。这就是这个包的由来。

类概述

使用

  • 安装

    • Composer
    composer require tei187/qr-image2svg
    • 手动(包下载)
      require_once( PATH_TO_EXTRACTED_PACKAGE . "/index.php" );
  • 配置

    配置类包含基于该过程运行所需的配置,是过程运行所必需的。它涉及以下内容

    示例

    <?php
      use tei187\QrImage2Svg\Configuration;
    
      $config = new Configuration(
        "/path/to/input",  // input path
        "/path/to/output", // output path
        "input.png",       // input file name
        null,              // no pre-assigned steps per axis
        200,               // threshold
        'red',             // red channel for threshold
        false,             // dont use 'magick' prefix in command line
        true               // use 'convert' prefix in command line
      );
    
      // (...)
  • 创建对象

      // (...)
    
      use tei187\QrImage2Svg\Processor\GD as GD;
      use tei187\QrImage2Svg\Processor\ImageMagick as ImageMagick;
      use tei187\QrImage2Svg\Processor\Imagick as Imagick;
    
      // GD-based library processor
      $gd = new GD($config);
    
      // ImageMagick-based command line prompt processor
      $im = new ImageMagick($config);
    
      // Imagick-based extension processor
      $i  = new Imagick($config);
    
      // (...)
  • 转换

      // (...)
      
      // GD
      $gd->output();
    
      // IM
      $im->output();
    
      // Imagick
      $i->output();
      

    这些将在输出目录中以与输入文件相同的名称输出生成的SVG文件。输出还使用布尔标志来确定是否应执行模块计数搜索。如果使用->output(false),则不会执行模块计数搜索,转换将基于配置类中定义的步骤数。

参数和输入要求

  • 文件

    包支持GD子类JPG、GIF、PNG、BMP和WEBP图像文件类型。对于ImageMagick,它取决于安装 - 要检查您的安装是否支持前面列出的图像类型,请使用'magick identify -list format'命令。

    输入图像文件应围绕二维码进行裁剪,以便图像没有额外的空白区域。这可以通过包处理(使用_trimImage方法),但严重依赖于图像的简单性 - 它可能在模糊或倾斜的图像上产生错误。

    此外,图像应按标准方式准备:填充/黑色方块的平均颜色值低于阈值,空白/白色方块的平均颜色值高于阈值。

    其他要求

    • 图像应该进行裁剪,就像“没有空白区域”一样(可以通过包处理,使用::trimImage方法,但需要一个处理得当的图像),
    • 图像应该以标准QR方式准备:填充/黑色方块的平均颜色值低于阈值,空白/白色方块的平均颜色值高于阈值,
    • 图像不应模糊(在实践中,它们不应过度模糊,尽管包对轻微模糊或抗锯齿处理得相当好),
    • 图像不能倾斜、不规则变形或以其他方式变形。
  • 步骤

    步骤描述了QR码的X或Y轴上的矩阵瓷砖数量,也称为"模块"。在这个范围内,一个瓷砖被认为是QR码矩阵中的一个单独位置。它的长度(在位图图像范围内)最好描述为代码左上角垂直边框的像素宽度。步骤的数量大致等于{图像宽度} / {平均瓷砖长度},向上取整到整数。然而,这个值不一定非得是精确的——它很大程度上取决于输入图像的参数和渲染,如边缘的防锯齿、压缩级别等。因此,这个值可能需要手动调整


    suggestTilesQuantity()方法中引入了额外的机制,其中处理器查找左上角标记的宽度,以顶部边框宽度作为标志。这个长度始终等同于7个QR瓷砖,所以{标记长度} / 7将以像素为单位的单个瓷砖的平均长度返回(浮点数,用于计算)。接下来,使用标记长度查找定时图案通道的位置,然后计算此特定行的中断。此方法返回更稳定、自动分配的步骤,或许未来可能会取代手动分配。目前,它尚未经过彻底测试——我能说的是,测试样本池顺利通过,而使用先前的方法时,同一样本池在某些样本中失败了。然而,建议图像的瓷砖至少为4x4像素——特别是当QR的密度较高时,较小的值会由于样本间距过短而产生偏差。


    如果已知QR版本,也可以指定步骤参数。在这种情况下,步骤将等于每轴的模块数,这等于({版本} * 4) + 17

  • 阈值

    通过平均颜色通道的值(平均值为(R + G + B) / 3)来进行瓷砖的探测。对于黑白QR码来说,填充和空白瓷砖应该非常明显不同,因此不应该有任何问题。然而,对于不同的色调、饱和度和亮度设置,可能会更复杂。需要一些手动输入和控制。目前,我建议通过CLUT或其他类似方法处理图像,直到我扩展这个包。

  • 裁剪

    通过模拟127-255的阈值并去除白色边框来进行边框的裁剪。如果您的QR码是反转的(亮色填充与暗色背景)或者瓷砖和背景填充的阈值都高于127,这可能会成为一个问题。在第二种情况下,该方法将返回FALSE,不会裁剪图像。

未来计划

  • 自动建议网格步骤长度 (已完成,查找suggestTilesQuantity()公共方法)
  • 扩展网格建议算法以检查最小平均瓷砖长度
  • 允许特定通道的阈值
  • 重新绘制为不同形状(例如圆形)

要求

  • PHP 7.4或更高版本
  • 以下处理器之一
    • GD扩展
    • Imagick扩展
    • ImageMagick (在7.0.8-7 Q16 x647.1.0-2 Q16 x64上测试过,似乎在7.0版本以下或任何版本的GraphicsMagick上运行不正常)

链接