tei187 / qr-image2svg
将基于位图图像的二维码转换为SVG格式。
Requires
- php: >=7.4
This package is auto-updated.
Last update: 2024-10-03 08:31:43 UTC
README
二维码图像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 x64和7.1.0-2 Q16 x64上测试过,似乎在7.0版本以下或任何版本的GraphicsMagick上运行不正常)