内容简介:级别:★★☆☆☆标签:「iOS CIFilter」「CIQRCodeGenerator」「CICode128BarcodeGenerator」「二维码加logo」作者: Xs·H
级别:★★☆☆☆
标签:「iOS CIFilter」「CIQRCodeGenerator」「CICode128BarcodeGenerator」「二维码加logo」
作者: Xs·H
审校:QiShare团队
接上文 iOS 扫描二维码/条形码 及 iOS 扫描相册图片二维码 ,本文介绍iOS 生成二维码/条形码的相关技术点。先看看示例效果:
一、生成二维码
CoreImage框架中的 CIFilter (常用来做滤镜)提供了生成二维码的方法,如下:
// 生成二维码
+ (UIImage *)generateQRCode:(NSString *)code size:(CGSize)size {
NSData *codeData = [code dataUsingEncoding:NSUTF8StringEncoding];
// 使用CIQRCodeGenerator创建filter
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator" withInputParameters:@{@"inputMessage": codeData, @"inputCorrectionLevel": QiInputCorrectionLevelH}];
// 由filter.outputImage直接转成的UIImage不太清楚,需要做高清处理
UIImage *codeImage = [QiCodeManager scaleImage:filter.outputImage toSize:size];
return codeImage;
}
复制代码
借助CIFilter,生成二维码的步骤非常简单:
1、准备好二维码内容数据 codeData ;
2、使用 CIQRCodeGenerator 创建 filter ;
3、为 filter 设置input参数: inputMessage : 要生成的二维码数据, inputCorrectionLevel : 二维码容错值;
4、通过 filter.outputImage 获取到CIImage类型的二维码图片,但图片不太清楚,需要做优化处理(见下文);
PS:
1、打印filter.inputKeys可查看不同 name 对应的input参数(比如 CIQRCodeGenerator 对应的 inputCorrectionLevel 参数);
2、 inputCorrectionLevel 对应四个容错率(如下),容错率越大,允许二维码污损的面积越大;
static NSString *QiInputCorrectionLevelL = @"L";//!< L: 7%
static NSString *QiInputCorrectionLevelM = @"M";//!< M: 15%
static NSString *QiInputCorrectionLevelQ = @"Q";//!< Q: 25%
static NSString *QiInputCorrectionLevelH = @"H";//!< H: 30%
二、生成条形码
生成条形码同样依赖 CIFilter ,且与生成二维码的方式相近,如下:
// 生成条形码
+ (UIImage *)generateCode128:(NSString *)code size:(CGSize)size {
NSData *codeData = [code dataUsingEncoding:NSUTF8StringEncoding];
// 使用CICode128BarcodeGenerator创建filter
CIFilter *filter = [CIFilter filterWithName:@"CICode128BarcodeGenerator" withInputParameters:@{@"inputMessage": codeData, @"inputQuietSpace": @.0}];
// 由filter.outputImage直接转成的UIImage不太清楚,需要做高清处理
UIImage *codeImage = [QiCodeManager scaleImage:filter.outputImage toSize:size];
return codeImage;
}
复制代码
生成条形码的步骤与生成二维码的步骤一样:
1、准备好条形码内容数据 codeData ;
2、使用 CICode128BarcodeGenerator 创建 filter ;
3、为 filter 设置input参数: inputMessage :
要生成的条形码数据, inputQuietSpace : 条形码留白距离, inputBarcodeHeight : 条形码高度;
4、通过 filter.outputImage 获取到CIImage类型的二维码图片,但图片不太清楚,需要做优化处理(见下文);
三、优化二维码/条形码
1、图片变高清
由上文可知,在生成二维码/条形码得到filter.outputImage后都做了处理,目的是将生成的图片变高清。代码如下:
// 缩放图片(生成高质量图片)
+ (UIImage *)scaleImage:(CIImage *)image toSize:(CGSize)size {
//! 将CIImage转成CGImageRef
CGRect integralRect = image.extent;// CGRectIntegral(image.extent);// 将rect取整后返回,origin取舍,size取入
CGImageRef imageRef = [[CIContext context] createCGImage:image fromRect:integralRect];
//! 创建上下文
CGFloat sideScale = fminf(size.width / integralRect.size.width, size.width / integralRect.size.height) * [UIScreen mainScreen].scale;// 计算需要缩放的比例
size_t contextRefWidth = ceilf(integralRect.size.width * sideScale);
size_t contextRefHeight = ceilf(integralRect.size.height * sideScale);
CGContextRef contextRef = CGBitmapContextCreate(nil, contextRefWidth, contextRefHeight, 8, 0, CGColorSpaceCreateDeviceGray(), (CGBitmapInfo)kCGImageAlphaNone);// 灰度、不透明
CGContextSetInterpolationQuality(contextRef, kCGInterpolationNone);// 设置上下文无插值
CGContextScaleCTM(contextRef, sideScale, sideScale);// 设置上下文缩放
CGContextDrawImage(contextRef, integralRect, imageRef);// 在上下文中的integralRect中绘制imageRef
//! 从上下文中获取CGImageRef
CGImageRef scaledImageRef = CGBitmapContextCreateImage(contextRef);
CGContextRelease(contextRef);
CGImageRelease(imageRef);
//! 将CGImageRefc转成UIImage
UIImage *scaledImage = [UIImage imageWithCGImage:scaledImageRef scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp];
return scaledImage;
}
复制代码
2、图片加logo
对于二维码而言,经常会看到在中间加上logo的样式(微信公众号的二维码等),可使用绘制的方式实现,如下:
// 合成图片(code+logo)
+ (UIImage *)combinateCodeImage:(UIImage *)codeImage andLogo:(UIImage *)logo {
UIGraphicsBeginImageContextWithOptions(codeImage.size, YES, [UIScreen mainScreen].scale);
// 将codeImage画到上下文中
[codeImage drawInRect:(CGRect){.0, .0, codeImage.size.width, codeImage.size.height}];
// 定义logo的绘制参数
CGFloat logoSide = fminf(codeImage.size.width, codeImage.size.height) / 4;
CGFloat logoX = (codeImage.size.width - logoSide) / 2;
CGFloat logoY = (codeImage.size.height - logoSide) / 2;
CGRect logoRect = (CGRect){logoX, logoY, logoSide, logoSide};
UIBezierPath *cornerPath = [UIBezierPath bezierPathWithRoundedRect:logoRect cornerRadius:logoSide / 5];
[cornerPath setLineWidth:2.0];
[[UIColor whiteColor] set];
[cornerPath stroke];
[cornerPath addClip];
// 将logo画到上下文中
[logo drawInRect:logoRect];
// 从上下文中读取image
codeImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return codeImage;
}
复制代码
示例源码QiQRCode 可从GitHub的 QiShare开源库 中获取。
作者微信:
关注我们的途径有:
QiShare(微信公众号)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- iOS 扫描二维码/条形码
- zbar条形码识别库vs配置
- 小程序中生成二维码和条形码
- Seppiko Chart 1.5 已经发布,Java 条形码库
- 用OpenCV和Python识别二维码和条形码
- 条形码处理类库 ZXing 3.3.3 发布,支持 Java 9
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Creative Curve
Allen Gannett / Knopf Doubleday Publishing Group / 2018-6-12
Big data entrepreneur Allen Gannett overturns the mythology around creative genius, and reveals the science and secrets behind achieving breakout commercial success in any field. We have been s......一起来看看 《The Creative Curve》 这本书的介绍吧!