2014-10-02 127 views
0

我正在使用CIFilter提供的CIQRCodeGenerator過濾器生成QR碼圖像。圖像生成良好,當它顯示時,我可以使用AVCaptureSession讀取圖像。但是,當我嘗試使用不同平臺(Android,BlackBerry,iOS 6)掃描QR碼時,則無法識別圖像。根據Apple的文檔,生成的圖像符合ISO/IEC 18004:2006標準。是否需要符合ISO 18004:2000標準的問題?iOS生成的QR碼未在其他平臺上識別

這裏是我使用來產生圖像的代碼:

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]; 

下面是一個簡單QR碼:

sample QR code

有誰知道是否有產生辦法使用CIFilter更全球公認的QR碼圖像?我真的不想回去使用ZXing。

謝謝!

+0

QR代碼是QR代碼...這是一個標準。 – ceejayoz 2014-10-02 20:29:29

+0

@ceejayoz這是一個標準,但有不同的文件覆蓋不同的實現。 ISO/IEC 18004:2000定義了QR碼模型1和2.ISO/IEC 18004:2006定義了QR碼2005符號,QR碼模型2的擴展(取自http://en.wikipedia.org/wiki/QR_code) 。 – mcsheffrey 2014-10-02 20:41:38

回答

4

我不知道,如果稍有變化有差別,但這裏是從我最近的一個項目,其產生從iPad攝像頭下的第二成功掃描的QR代碼片段:

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); 
+0

這樣做!對setDefaults的調用似乎沒有做任何事情(我期望的),但用CIContext創建CGImageRef的中間步驟以某種方式解決了問題。謝謝! – mcsheffrey 2014-10-03 00:25:08

+0

此代碼泄漏內存。不要忘記釋放'CGImageRef'。 – 2014-10-03 05:34:05

+0

沒問題@mcsheffrey :)修正答案釋放我的'CGImageRef' – Chris 2014-10-03 14:11:05

1

您正在使用ISO-8859-1字符集,但不同的QR碼閱讀器會根據他們所遵循的標準版本採用不同的字符編碼方式。 UTF-8似乎比ISO-8859-1更常見。

+0

是的,我最初使用的是UTF-8編碼,它不能工作,所以我將它切換到NSISOLatin1StringEncoding,因爲這是Apple推薦的CIQRCodeGenerator文檔。我認爲UTF-8可能最適合在這裏使用,但這不是我遇到的問題的原因。謝謝! – mcsheffrey 2014-10-03 00:28:28