在前面的博客中介绍了如何实现二维码扫描,今天继续说说怎么实现二维码的生成。

同样是在iOS 7以后,Apple给出了官方的解决方案 — CoreImage中的CIQRCodeGenerator

CIQRCodeGenerator

Generates a Quick Response code (two-dimensional barcode) from input data.

Parameters

  • inputMessage:

    The data to be encoded as a QR code. An NSData object whose display name is Message.

  • inputCorrectionLevel

    A single letter specifying the error correction format. An NSString object whose display name is CorrectionLevel. Default value: M

Usage

@import CoreImage;

- (UIImage *)qrImageForString:(NSString *)qrString
{
    // Need to convert the string to a UTF-8 encoded NSData object
    NSData *stringData = [qrString dataUsingEncoding:NSUTF8StringEncoding];
    
    // Create the filter
    CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    // Set the message content and error-correction level
    [qrFilter setValue:stringData forKey:@"inputMessage"];
    [qrFilter setValue:@"H" forKey:@"inputCorrectionLevel"];
    
    // Send the image back
    CIImage *outputImage = qrFilter.outputImage;
    UIImage *image = [UIImage imageWithCIImage:outputImage
                                         scale:1.
                                   orientation:UIImageOrientationUp];
    return image;
}

如果直接使用这个UIImage,会发现得到的二维码很模糊,这是因为通过filter的outputImage属性获得的CIImage,只满足了1pt resolution for the smallest squares。

我们可以通过kCGInterpolationNone的方式进行拉伸,来获得更清晰的图片。

- (UIImage *)resizeImage:(UIImage *)image
             withQuality:(CGInterpolationQuality)quality
                    rate:(CGFloat)rate
{
    UIImage *resized = nil;
    CGFloat width = image.size.width * rate;
    CGFloat height = image.size.height * rate;
    
    UIGraphicsBeginImageContext(CGSizeMake(width, height));
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetInterpolationQuality(context, quality);
    [image drawInRect:CGRectMake(0, 0, width, height)];
    resized = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return resized;
}

完整的流程:

NSString *string = @"http://jowyer.github.io/";

UIImage *qrImage = [self qrImageForString:string];

UIImage *resizedImage = [self resizeImage:qrImage
                              withQuality:kCGInterpolationNone
                                     rate:5.0];

self.myImageView.image = resizedImage;

Reference

ShinobiControls

shu223

郭宇翔