我正在尝试使用CoreImage生成二维码。我希望能够控制符号版本、掩码模式和纠错级别。
使用简单的"CIFilter filterWithName:“不提供设置符号版本或掩码模式的能力。
唯一可能的方法是使用CIQRCodeDescriptor -使用"CIQRCodeDesciptor initWithPayload: symbolVersion: maskPattern: errorCorrectionLevel:“
有没有人能够使用这种方法成功地生成二维码图像?
如果是这样的话,你能发布一个简单的完整的例子吗?
发布于 2020-09-29 23:25:51
要能够使用CIQRCodeDescriptor,您需要
模式符号版本(模式+字符计数+数据+终止符+ padding)
遵循“以不同方式思考”的例子。

注意码字中的额外比特
码字结构在nayuiki或底部进行了说明。
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
}

备注:
段模式始终是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
发布于 2019-09-04 14:40:44
看起来CIQRCodeGenerator不支持这些参数。也许你可以在this library中找到你想要的东西。
发布于 2021-10-22 18:39:14
您需要使用带有CIQRCodeDescriptor的"CIBarcodeGenerator“CIFilter作为输入:
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数据。
https://stackoverflow.com/questions/57777948
复制相似问题