Generate QR Code
在前面的博客中介绍了如何实现二维码扫描,今天继续说说怎么实现二维码的生成。
同样是在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;