使用 CIFilter 可以不引入任何第三方库, 就可以生成想要的二维码和条形码, 今天简单的介绍一下使用 CIFilter 生成二维码和条形码. 系统 CIFilter 生成的二维码和条形码的大小有时并不能满足需求, 直接使用起来, 二维码图片看起来有些模糊, 这就需要我们手动的根据目标大小重新生成清晰的二维码和条形码.
1. 生成二维码 (iOS7.0 以上支持)
- /**
- inputCorrectionLevel
- 等级 容错率
- L 7%
- M 15% 默认值
- Q 25%
- H 30%
- */
- + (UIImage *)generateQRCodeWithInputMessage:(NSString *)inputMessage
- Width:(CGFloat)width
- Height:(CGFloat)height{
- NSData *inputData = [inputMessage dataUsingEncoding:NSUTF8StringEncoding];
- CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
- [filter setValue:inputData forKey:@"inputMessage"];
- // [filter setValue:@"H" forKey:@"inputCorrectionLevel"]; // 设置二维码不同级别的容错率
- CIImage *ciImage = filter.outputImage;
- // 消除模糊
- CGFloat scaleX = MIN(width, height)/ciImage.extent.size.width;
- CGFloat scaleY = MIN(width, height)/ciImage.extent.size.height;
- ciImage = [ciImage imageByApplyingTransform:CGAffineTransformScale(CGAffineTransformIdentity, scaleX, scaleY)];
- UIImage *returnImage = [UIImage imageWithCIImage:ciImage];
- return returnImage;
- }
二维码中心添加图片
- + (UIImage *)generateQRCodeWithInputMessage:(NSString *)inputMessage
- Width:(CGFloat)width
- Height:(CGFloat)height
- AndCenterImage:(UIImage *)centerImage{
- UIImage *backImage = [self generateQRCodeWithInputMessage:inputMessage Width:width Height:height];
- UIGraphicsBeginImageContext(backImage.size);
- [backImage drawInRect:CGRectMake(0, 0, backImage.size.width, backImage.size.height)];
- CGFloat centerImageWH = MIN(backImage.size.width, backImage.size.height) * 0.15;
- [centerImage drawInRect:CGRectMake((backImage.size.width - centerImageWH)*0.5, (backImage.size.height - centerImageWH)*0.5, centerImageWH, centerImageWH)];
- UIImage *returnImage = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return returnImage;
- }
**2. 生成条形码 (iOS8.0 以上 支持)**
- #pragma mark - 获取条形码
- -(UIImage*)createBarImageWithOrderStr:(NSString*)str{
- // 创建条形码
- CIFilter *filter = [CIFilter filterWithName:@"CICode128BarcodeGenerator"];
- // 恢复滤镜的默认属性
- [filter setDefaults];
- // 将字符串转换成 NSData
- NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
- // 通过 KVO 设置滤镜 inputMessage 数据
- [filter setValue:data forKey:@"inputMessage"];
- // 获得滤镜输出的图像
- CIImage *outputImage = [filter outputImage];
- // 将 CIImage 转换成 UIImage, 并放大显示
- UIImage* image = [UIImage imageWithCIImage:outputImage scale:0 orientation:UIImageOrientationUp];
- return image;
- }
- + (UIImage *)generateBarcodeWithInputMessage:(NSString *)inputMessage
- Width:(CGFloat)width
- Height:(CGFloat)height{
- NSData *inputData = [inputMessage dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:false];
- CIFilter *filter = [CIFilter filterWithName:@"CICode128BarcodeGenerator"];
- [filter setValue:inputData forKey:@"inputMessage"]; // 设置条形码内容
- // [filter setValue:@(50) forKey:@"inputQuietSpace"]; // 设置条形码上下左右 margin 值
- // [filter setValue:@(height) forKey:@"inputBarcodeHeight"]; // 设置条形码高度
- CIImage *ciImage = filter.outputImage;
- CGFloat scaleX = width/ciImage.extent.size.width;
- CGFloat scaleY = height/ciImage.extent.size.height;
- ciImage = [ciImage imageByApplyingTransform:CGAffineTransformScale(CGAffineTransformIdentity, scaleX, scaleY)];
- UIImage *returnImage = [UIImage imageWithCIImage:ciImage];
- return returnImage;
- }
- /**
- 生成条形码
- */
- (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;
- }
- }
以上就是使用 iOS 系统原生的 CIFilter 生成二维码和条形码, 对于生成二维码和条形码时, CIFilter 的参数的定义可以参考官方文档.
来源: http://www.bubuko.com/infodetail-2652054.html