【发布时间】:2018-03-21 08:14:56
【问题描述】:
我有很长的 int 数字,我想将它编码为 QRCode,使用完全数字类型的编码。现在我使用 CIFilter(name: "CIQRCodeGenerator"),但在这种情况下,我不知道如何选择编码类型。有没有办法创建具有所选编码类型的二维码?
【问题讨论】:
我有很长的 int 数字,我想将它编码为 QRCode,使用完全数字类型的编码。现在我使用 CIFilter(name: "CIQRCodeGenerator"),但在这种情况下,我不知道如何选择编码类型。有没有办法创建具有所选编码类型的二维码?
【问题讨论】:
The Apple documentation for CIQRCodeGenerator 表示您应该使用NSISOLatin1StringEncoding (Objective-C) 或String.Encoding.isoLatin1 (Swift) 来编码二维码。
这是一个在 Swift 4 中从给定输入整数生成 UIImage 的快速示例。
enum QRInputEncoding: Int {
case octal = 8
case decimal = 10
case hexadecimal = 16
}
func makeQRImage(input: Int, encoding: QRInputEncoding) -> UIImage? {
let encoded = String(input, radix: encoding.rawValue)
print(encoded)
guard let data = encoded.data(using: .isoLatin1) else {
return nil
}
let filter = CIFilter(name: "CIQRCodeGenerator", withInputParameters: ["inputMessage": data])
return filter?.outputImage.map(UIImage.init(ciImage:))
}
makeQRImage(input: 100000, encoding: .octal) // prints 303240
makeQRImage(input: 100000, encoding: .decimal) // prints 100000
makeQRImage(input: 100000, encoding: .hexadecimal) // prints 186a0
这允许您更改生成的 QR 码输出,以便阅读器可以读取更少的字符,从而导致相同数字的 QR 码更小。
【讨论】:
这将生成二维码图像并返回
func makeQRImage(inputText: String) -> UIImage {
let data = inputText.dataUsingEncoding(NSISOLatin1StringEncoding, allowLossyConversion: false)
let filter = CIFilter(name: "CIQRCodeGenerator")
filter.setValue(data, forKey: "inputMessage")
filter.setValue("Q", forKey: "inputCorrectionLevel")
return filter.outputImage
}
您可以按照以下代码进行任何其他操作:https://github.com/appcoda/QR-Code-Generator
【讨论】: