使用CIFilter可以不引入任何第三方庫,就可以生成想要的二維碼和條形碼万哪,今天簡單的介紹一下使用CIFilter生成二維碼和條形碼。系統(tǒng)CIFilter生成的二維碼和條形碼的大小有時并不能滿足需求政钟,直接使用起來蜈敢,二維碼圖片看起來有些模糊,這就需要我們手動的根據(jù)目標大小重新生成清晰的二維碼和條形碼殴俱。
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以上的系統(tǒng)才支持條形碼的生成政冻,iOS8.0以下使用第三方控件生成
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
// 注意生成條形碼的編碼方式
NSData *data = [source dataUsingEncoding: NSASCIIStringEncoding];
CIFilter *filter = [CIFilter filterWithName:@"CICode128BarcodeGenerator"];
[filter setValue:data forKey:@"inputMessage"];
// 設(shè)置生成的條形碼的上,下线欲,左明场,右的margins的值
[filter setValue:[NSNumber numberWithInteger:0] forKey:@"inputQuietSpace"];
return filter.outputImage;
}else{
return nil;
}
}
**3. 生成自定義的二維碼和條形碼的大小**
/**
- 調(diào)整生成的圖片的大小
- @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.運行結(jié)果**
![二維碼和條形碼.png](http://upload-images.jianshu.io/upload_images/2167500-7bd611cb84c3165a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
以上就是使用iOS系統(tǒng)原生的CIFilter生成二維碼和條形碼,對于生成二維碼和條形碼時李丰,CIFilter的參數(shù)的定義可以參考官方文檔苦锨。