用URL生成二維碼,也可以通過二維碼獲取URL(可用於長按識別二維碼)
#pragma mark - 二維碼轉換
// url生成二維碼
+ (UIImage *)getQRCodeWithUrlString:(NSString *)urlStr size:(CGFloat)size
{
// 1.創建過濾器
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 2.恢復默認
[filter setDefaults];
// 3.給過濾器添加數據(正則表達式/賬號和密碼)
NSData *data = [urlStr dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:data forKeyPath:@"inputMessage"];
// 4.獲取輸出的二維碼
CIImage *outputImage = [filter outputImage];
// 5.將CIImage轉換成UIImage,並放大顯示
CGRect extent = CGRectIntegral(outputImage.extent);
CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
// 5.1.創建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:outputImage fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent, bitmapImage);
// 5.2.保存bitmap到圖片
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage imageWithCGImage:scaledImage];
}
/**
* 從照片中直接識別二維碼
* @param myQRCode 二維碼包含的內容
*/
- (void)readQRCodeFromImageWithmyQRCode:(void(^)(NSString *qrString,NSError *error))myQRCode
{
if (!self)
{
myQRCode(nil,[NSError errorWithDomain:@"未傳入圖片" code:0 userInfo:nil]);
return;
}
CIContext *context = [CIContext contextWithOptions:nil];
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:context options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];
CIImage *image = [CIImage imageWithCGImage:self.CGImage];
NSArray *features = [detector featuresInImage:image];
if (features.count)
{
CIQRCodeFeature *feature = [features firstObject];
NSString *result = feature.messageString;
myQRCode(result,nil);
}
else
{
myQRCode(nil,[NSError errorWithDomain:@"未能識別出二維碼" code:0 userInfo:nil]);
return;
}
}