在Swift 3.0中生成基本QR代码

QR码是一种二维条形码,最初是为日本汽车工业开发的。 编码URL,推广虚拟商店,访问加密货币钱包,向消息传递平台添加新联系人— QR码(或其某些变体)为处理各种类型的数据提供了一种简化的方法。

让我们看一下使用静态数据创建我们的代码(例如,字符串)。

在上面的代码中,我们创建了一个称为generateQRCode(from:)的函数,该函数返回可选的UIImage

在此函数中,我们首先要将字符串转换为Data对象(它只是字节的MutableCollection )。 该对象将使用某些给定的编码包含我们字符串的表示形式。 在这种情况下,我们使用ISO Latin 1 ; 但是, ASCIIUTF-8也可以。

现在,使用参数名称“ CIQRCodeGenerator”创建CoreImage过滤器的实例

本质上,我们已经初始化了一个CIFilter对象,该对象用于名为“ CIQRCodeGenerator”的特定过滤器此参数名称使我们可以引用Swift的内置过滤器来通过Core Image框架生成QR代码。 在Swift中使用CIFilter方法创建过滤器后,必须调用setDefaults()setValue(_:forKey:)分别设置参数。

在Swift中使用CIFilter方法创建过滤器后,必须调用setDefaults()setValue(_:forKey:)分别设置参数。

考虑到潜在的复杂性,在某种程度上这似乎是深奥的,而且应该在某种程度上。 仔细看看下一行:

在这里,我们传递data常量(它只是字符串的编码版本)来设置键“ inputMessage”的值这一步骤至关重要,并且因为设置和检索了CIFilter对象的参数,所以它以这种方式工作通过使用键值对

做完了! 好吧,不完全是。

回顾一下,我们向generateQRCode(from:)函数传递了一个字符串,然后将该字符串编码为数据对象。 然后,我们创建了一种特定类型“ CIQRCodeGenerator”CIFilter对象最后,我们使用了数据对象来设置键“ inputMessage”的值,该键表示在QR码生成中使用的数据输入。 本质上,我们已经检索了一个特定的模板,收集了所有必需的组件,但是仍然没有返回任何内容。

不用担心转换废话; 我们将在片刻内解决该问题(我们正在使用它来消除生成的QR码中的模糊感)。

专注于展开输出。 我们为什么这样做呢? 这是因为filter(这是我们的CIFilter )返回一个可选的CIImage (再次,请随意忽略最后的.applying(transform) )。

在这种情况下, CIFilter最终使用字符串作为输入来生成CIImage对象。 为了使图像正确显示在imageView插座中,我们将其投射为UIImage 。 最后,我们得到以下信息:

不好了! 为什么我们的QR码如此模糊? 由于我们的CIImage是由点组成的,因此将所得的UIImage缩放为适合我们的UIImageView ,这导致缺乏清晰度。 这就是变换部分的来历!

我们创建一个仿射变换矩阵 ,用于缩放QR码。 这只是用于绘制2D图形的struct 。 简而言之,此矩阵通过指定一个坐标系中的点如何映射到另一个坐标系中的点来链接两个坐标系。 然后,我们在解开生成的可选CIImage时应用它。

这里的关键是两个比例值-x和y。 我们将它们都设置为1,这正是我们创建质量异常差的QR码的原因。 如果我们尝试将两个值( scaleXscaleY )都更改为100怎么办?

我们已经成功扩大了我们的UIImage 。 老实说,我们只是使用了任意数量的数字。 如果我们想更详细地说明缩放比例,可以通过编程来计算出所需的缩放比例 。 那么这个缩放因子是多少?

好吧,实际上,它始终等于图像视图的宽度与原始QR码的宽度之比。 在我们的示例中,这表示为:

我们添加了三行新代码。 首先,我们通过在CIFilter对象上调用outputImage创建了一个CIImage对象。 由于此方法返回一个可选值,因此我们使用了保护语句来对其进行包装。 接下来,我们为两个轴(x和y)设置了两个常数。 如上所述, scaleXscaleY分别简单地等于图像视图的宽度和高度与QR码的宽度和高度之比。 最后,我们将这两个比率作为参数传递给CGAffineTransform以获得适当缩放的仿射变换矩阵(即transform )。 然后,我们在outputImage上调用outputImage applying(transform)获得以下结果:

我们在QR码生成过程中可以做的另一件事是设置用于纠错的值。 这是通过键“ inputCorrectionLevel”完成的。

此参数控制在输出图像中编码的附加数据的数量,以提供纠错功能。 默认情况下,它等于“ M”更改此参数会影响最终的QR码形状 。 较高的级别会产生较大的输出图像,但会损坏较大的代码区域。

仅此而已! 您现在已经掌握了Swift中的QR代码生成。

Swift中的QR代码还有很多,但这就是我们的教程。 感谢您阅读Swift中QR生成的简单概述!