首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CIQRCodeDescriptor initWithPayload: symbolVersion: maskPattern errorCorrectionLevel生成二维码:

使用CIQRCodeDescriptor initWithPayload: symbolVersion: maskPattern errorCorrectionLevel生成二维码:
EN

Stack Overflow用户
提问于 2019-09-04 03:51:44
回答 4查看 371关注 0票数 1

我正在尝试使用CoreImage生成二维码。我希望能够控制符号版本、掩码模式和纠错级别。

使用简单的"CIFilter filterWithName:“不提供设置符号版本或掩码模式的能力。

唯一可能的方法是使用CIQRCodeDescriptor -使用"CIQRCodeDesciptor initWithPayload: symbolVersion: maskPattern: errorCorrectionLevel:“

有没有人能够使用这种方法成功地生成二维码图像?

如果是这样的话,你能发布一个简单的完整的例子吗?

EN

回答 4

Stack Overflow用户

发布于 2020-09-29 23:25:51

要能够使用CIQRCodeDescriptor,您需要

模式符号版本(模式+字符计数+数据+终止符+ padding)

  • correct符号版本(版本用于字符计数;1-40)
  • 正确的掩码模式(具有最小惩罚的掩码;0-7)

遵循“以不同方式思考”的例子。

注意码字中的额外比特

  • 思考不同: 54 68 69 6E 6B 20 44 69 66 66 65 72 65 6E 74
  • 码字: 40 F5 46 86 96 E6 B2 04 46 96 66 66 57 26 56 E7 40 EC 11

码字结构在nayuiki或底部进行了说明。

代码语言:javascript
复制
let codeword : [UInt8] = [0x40, 0xf5, 0x46, 0x86, 0x96, 0xe6, 0xb2, 0x04, 0x46, 0x96, 0x66, 0x66, 0x57, 0x26, 0x56, 0xe7, 0x40, 0xec, 0x11]
let data = Data(bytes: codeword, count: codeword.count)
if let descriptor = CIQRCodeDescriptor(payload: data, symbolVersion: 1, maskPattern: 4, errorCorrectionLevel: .levelL) {
    if let image = imageFromBarcodeCodeDescriptor(descriptor)?.transformed(by: .init(scaleX: 10, y: 10)) {
        let newImage = NSImage()
        newImage.addRepresentation(NSCIImageRep(ciImage: image))
        imageView1.image = newImage
    }
}

func imageFromBarcodeCodeDescriptor(_ descriptor: CIBarcodeDescriptor) -> CIImage? {
    let filter =  CIFilter(name: "CIBarcodeGenerator", parameters: ["inputBarcodeDescriptor" : descriptor])
    return filter?.outputImage
}

  1. 连接段,添加填充,make codewords

备注:

段模式始终是4位字段。

字符数的字段宽度取决于模式和版本。

终止符通常是四个“0”比特,但是如果达到数据码字容量,则会更少。

位填充在0到7个“0”位之间,以填充最后一个字节中所有未使用的位。

字节填充由交替的(十六进制) EC和11组成,直到达到容量。

整个数据位序列: 01000000111101010100011010000110100101101110011010110010000001000100011010010110011001100110011001010111001001100101011011100111010000001110110000010001

数据码字字节的整个序列(通过将位串分成8位的组),以十六进制显示: 40 F5 46 86 96 E6 B2 04 46 96 66 66 57 26 56 E7 40 EC 11

票数 1
EN

Stack Overflow用户

发布于 2019-09-04 14:40:44

看起来CIQRCodeGenerator不支持这些参数。也许你可以在this library中找到你想要的东西。

票数 0
EN

Stack Overflow用户

发布于 2021-10-22 18:39:14

您需要使用带有CIQRCodeDescriptor的"CIBarcodeGenerator“CIFilter作为输入:

代码语言:javascript
复制
let data = ... // error corrected payload data

if let barcode = CIQRCodeDescriptor(payload: data,
                                 symbolVersion: 1, // 1...40
                                 maskPattern: 0, // 0..7
                                 errorCorrectionLevel: .levelL) // Any of the available enum values
{
    let filter = CIFilter(name: "CIBarcodeGenerator",
                          parameters: ["inputBarcodeDescriptor": barcode])

    let image = filter?.outputImage
}

不过,需要注意的是,您需要以某种方式获得要编码的消息的errorCorrectedPayload数据。其中一种方法是使用"CIQRCodeGenerator“对消息进行编码,使用Vision解析生成的图像以从中提取条形码描述符,然后从该描述符中获取errorCorrectedPayload数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57777948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档