【问题标题】:iOS generated QR code not recognized on other platformsiOS 生成的二维码在其他平台上无法识别
【发布时间】:2014-11-27 22:17:09
【问题描述】:

我正在使用 CIFilter 提供的 CIQRCodeGenerator 过滤器生成 QR 码图像。图像生成良好,当它显示时,我可以使用 AVCaptureSession 读取图像。但是,当我尝试使用不同的平台(Android、BlackBerry、iOS 6)扫描 QR 码时,它无法识别图像。根据 Apple 的文档,生成的图像符合 ISO/IEC 18004:2006 标准。问题是我需要符合 ISO 18004:2000 的东西吗?

这是我用来生成图像的代码:

NSData *stringData = [stringToEncode dataUsingEncoding:NSISOLatin1StringEncoding];

CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];

[qrFilter setValue:stringData forKey:@"inputMessage"];
[qrFilter setValue:@"M" forKey:@"inputCorrectionLevel"];

CIImage *qrImage = qrFilter.outputImage;

return [UIImage squareUIImageFromCIImage:qrImage withSize:size];

这是一个示例二维码:

有人知道是否有办法使用 CIFilter 生成更普遍认可的 QR 码图像吗?我真的不想再使用 ZXing。

谢谢!

【问题讨论】:

  • 二维码就是二维码……这是标准。
  • @ceejayoz 这是一个标准,但不同的文档涵盖了不同的实现。 ISO/IEC 18004:2000 定义了二维码模型 1 和 2。ISO/IEC 18004:2006 定义了二维码 2005 符号,二维码模型 2 的扩展(取自en.wikipedia.org/wiki/QR_code)。

标签: ios qr-code cifilter


【解决方案1】:

我不确定细微的变化是否会产生影响,但这是我最近的项目中的一个 sn-p,它生成一个 QR 码,可以在一秒钟内从 iPad 相机成功扫描:

 CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];

[filter setDefaults];

NSData *data = [accountNumber dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:data forKey:@"inputMessage"];

CIImage *outputImage = [filter outputImage];

CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgImage = [context createCGImage:outputImage
                                   fromRect:[outputImage extent]];

UIImage *barcode = [UIImage imageWithCGImage:cgImage
                                     scale:1.
                               orientation:UIImageOrientationUp];

// EDIT: 
CFRelease(cgImage);

【讨论】:

  • 做到了!对 setDefaults 的调用似乎没有做任何事情(这是我所期望的),但是使用 CIContext 创建 CGImageRef 的中间步骤以某种方式解决了这个问题。谢谢!
  • 此代码泄漏内存。不要忘记发布CGImageRef
  • 没问题@mcsheffrey :) 修复了发布我的CGImageRef的答案
【解决方案2】:

您使用的是 ISO-8859-1 字符集,但不同的 QR 码阅读器会根据他们所遵循的标准版本对字符编码进行不同的假设。 UTF-8 似乎比 ISO-8859-1 更常见。

【讨论】:

  • 是的,我最初使用的是 UTF-8 编码,但它不起作用,所以我将它切换为 NSISOLatin1StringEncoding,因为这是 Apple 文档 CIQRCodeGenerator 推荐的内容。我认为 UTF-8 可能最好在这里使用,但这不是我遇到问题的原因。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-18
  • 2014-08-14
  • 1970-01-01
相关资源
最近更新 更多