使用CIFilter生成二維碼,CIDetector解析照片庫裏面的二維碼圖片

     鑑於以前作項目二維碼的生成,解析用的都是zxing,zbar這些第三方的東西,用起來也很方便;最近閒來無事,瞭解了下ios sdk對於二維碼的支持,上一篇文章介紹的是關於二維碼的掃描:http://my.oschina.net/u/1432769/blog/542799; 這篇介紹下CIFilter、CIDetector實現二維碼的過程須要注意的一些問題ios

1、生成iphone

    二維碼的生成能夠使用coreimage.framework這個裏面的CIFilter類來生成spa

+ (CIImage *)ciImageFromString:(NSString *)qrString {.net

    NSData *stringData = [qrString dataUsingEncoding:NSUTF8StringEncoding];調試

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

    [qrFilter setValue:stringData forKey:@"inputMessage"];blog

    [qrFilter setValue:@"M" forKey:@"inputCorrectionLevel"];圖片

    return qrFilter.outputImage;ip

}ci

+ (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {

    CGRect extent = CGRectIntegral(image.extent);

    CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));

    // 建立bitmap;

    size_t width = CGRectGetWidth(extent) * scale;

    size_t height = CGRectGetHeight(extent) * scale;

    CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();

    CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);

    CIContext *context = [CIContext contextWithOptions:nil];

    CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];

    CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);

    CGContextScaleCTM(bitmapRef, scale, scale);

    CGContextDrawImage(bitmapRef, extent, bitmapImage);

    // 保存bitmap到圖片

    CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);

    CGContextRelease(bitmapRef);

    CGImageRelease(bitmapImage);

    return [UIImage imageWithCGImage:scaledImage];

}

生成沒有碰到什麼問題,直接調用上面的就能夠生成簡單的二維碼,(其餘的包括顏色,或者加上logo,不在這列)


2、解析

     在解析指定image的時候,能夠用 CIDetector(這個類還能夠進行人臉識別等功能)來進行,主要解析的過程,代碼比較簡單,以下

+ (NSString *)stringFromCiImage:(CIImage *)ciimage {

    NSString *content = @"" ;


    if (!ciimage) {

        return content;

    }


    CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode

                                              context:[CIContext contextWithOptions:nil]

                                              options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];

    NSArray *features = [detector featuresInImage:ciimage];

    if (features.count) {


        for (CIFeature *feature in features) {

            if ([feature isKindOfClass:[CIQRCodeFeature class]]) {

                content = ((CIQRCodeFeature *)feature).messageString;

                break;

            }

        }

    } else {

        NSLog(@"未正常解析二維碼圖片, 請確保iphone5/5c以上的設備");

    }


    return content;

}

可是,因爲本人用的是5c進行調試:

一、發現每次獲取的features都是nil, 沒法正常解析,經過上網查閱資料發現,有說讓換圖片,有讓用真機的,不少種說法;可是各類嘗試各類失敗了結,最後在stackoverflow看到關於5s及CIDetectorTypeQRCode的問題,獲得提示,而後果斷換了mini4進行調試,發現能夠正常解析,接着拿了mini2調試,發現依舊能夠,只有手上的5c是無法正常解析

二、經過「1」中的調試,猜想可能CIDetector的二維碼解析須要是五、5c之後的設備,繼續上網查閱,發現一個文章裏面,做者提到Ta的解釋,用真機或者5s以上的模擬器能夠正常解析,那麼經過本人根據提示使用模擬器調試,發現確實須要是5s及以上模擬器才能正常解析

相關文章
相關標籤/搜索