使用CIFilter可以不引入任何第三方库,就可以生成想要的二维码和条形码,今天简单的介绍一下使用CIFilter生成二维码和条形码。系统CIFilter生成的二维码和条形码的大小有时并不能满足需求,直接使用起来,二维码图片看起来有些模糊,这就需要我们手动的根据目标大小重新生成清晰的二维码和条形码。
1.生成二维码(iOS7.0以上支持)
/**
* 生成二维码
*/
- (IBAction)generateQRCode:(id)sender {
CIImage *ciImage = [self generateQRCodeImage:@"http://www.baidu.com"];
_qRCodeImageView.image = [self resizeCodeImage:ciImage withSize:CGSizeMake(200, 200)];
}
/**
* 二维码图片
*
* @param source
*
* @return CIImage 对象
*/
- (CIImage *)generateQRCodeImage:(NSString *)source
{
NSData *data = [source dataUsingEncoding:NSUTF8StringEncoding];
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
[filter setValue:data forKey:@"inputMessage"];
[filter setValue:@"Q" forKey:@"inputCorrectionLevel"];
return filter.outputImage;
}```
**2. 生成条形码 (iOS8.0以上 支持)**
/**
- 生成条形码
*/
- (IBAction)generateBarCode:(id)sender {
CIImage ciImage = [self generateBarCodeImage:@"1234567890"];
UIImage image = [self resizeCodeImage:ciImage withSize:CGSizeMake((self.view.frame.size.width - 80), 80)];
_barCodeImageView.image = image;
}
/
- 生成条形码
- @param source
- @return 生成条形码的CIImage对象
*/
- (CIImage *) generateBarCodeImage:(NSString *)source
{
// iOS 8.0以上的系统才支持条形码的生成,iOS8.0以下使用第三方控件生成
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
// 注意生成条形码的编码方式
NSData *data = [source dataUsingEncoding: NSASCIIStringEncoding];
CIFilter *filter = [CIFilter filterWithName:@"CICode128BarcodeGenerator"];
[filter setValue:data forKey:@"inputMessage"];
// 设置生成的条形码的上,下,左,右的margins的值
[filter setValue:[NSNumber numberWithInteger:0] forKey:@"inputQuietSpace"];
return filter.outputImage;
}else{
return nil;
}
}
**3. 生成自定义的二维码和条形码的大小**
/**
- 调整生成的图片的大小
- @param image CIImage对象
- @param size 需要的UIImage的大小
- @return size大小的UIImage对象
*/
- (UIImage *) resizeCodeImage:(CIImage *)image withSize:(CGSize)size
{
if (image) {
CGRect extent = CGRectIntegral(image.extent);
CGFloat scaleWidth = size.width/CGRectGetWidth(extent);
CGFloat scaleHeight = size.height/CGRectGetHeight(extent);
size_t width = CGRectGetWidth(extent) * scaleWidth;
size_t height = CGRectGetHeight(extent) * scaleHeight;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceGray();
CGContextRef contentRef = CGBitmapContextCreate(nil, width, height, 8, 0, colorSpaceRef, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef imageRef = [context createCGImage:image fromRect:extent];
CGContextSetInterpolationQuality(contentRef, kCGInterpolationNone);
CGContextScaleCTM(contentRef, scaleWidth, scaleHeight);
CGContextDrawImage(contentRef, extent, imageRef);
CGImageRef imageRefResized = CGBitmapContextCreateImage(contentRef);
CGContextRelease(contentRef);
CGImageRelease(imageRef);
return [UIImage imageWithCGImage:imageRefResized];
}else{
return nil;
}
}
**4.运行结果**
![二维码和条形码.png](http:https://img.haomeiwen.com/i2167500/7bd611cb84c3165a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
以上就是使用iOS系统原生的CIFilter生成二维码和条形码,对于生成二维码和条形码时,CIFilter的参数的定义可以参考官方文档。
网友评论
时表示没有这个“inputQuietSpace”key怎么办??