iOS(OC)用系统方法生成二维码,本文章只是生成
导入头文件 #import <CoreImage/CoreImage.h>
//创建名为"CIQRCodeGenerator"的CIFilter
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
//将filter所有属性设置为默认值
[filter setDefaults];
//将所需尽心转为UTF8的数据,并设置给filter
NSString * str = self.urlTextF.text.length>0?self.urlTextF.text:@"这是一个测试二维码";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:data forKey:@"inputMessage"];
//设置二维码的纠错水平,越高纠错水平越高,可以污损的范围越大
/*
* L: 7%
* M: 15%
* Q: 25%
* H: 30%
*/
[filter setValue:@"H" forKey:@"inputCorrectionLevel"];
//拿到二维码图片,此时的图片不是很清晰,需要二次加工
CIImage *outPutImage = [filter outputImage];
// UIImage * codeImg = [self sencond_getHDImgWithCIImage:outPutImage
// size:CGSizeMake(130, 130)
// pointColor:nil
// backColor:nil];
UIImage * codeImg = [self getHDImgWithCIImage:outPutImage
size:CGSizeMake(130, 130)
waterImg:[UIImage imageNamed:@"login_logo"]
waterSize:CGSizeMake(35, 35)];
[self.codeImgV setImage:codeImg];
这个时候已经生成了二维码,然后需要对其进行大小,颜色,log的编辑
调整图片大小,颜色
/**
调整二维码清晰度
@param img 二维码图片
@param size 二维码大小
@param pointColor 二维码的颜色(默认黑色)
@param backgroundColor 二维码的背景(默认白色)
@return 生成后的二维码
*/
- (UIImage *)sencond_getHDImgWithCIImage:(CIImage *)img size:(CGSize)size pointColor:(UIColor *)pointColor backColor:(UIColor *)backgroundColor{
//设置二维码的颜色
if (pointColor == nil) {
pointColor = [UIColor blackColor];
}
//设置背景颜色
if (backgroundColor == nil) {
backgroundColor = [UIColor whiteColor];
}
CIFilter *colorFilter = [CIFilter filterWithName:@"CIFalseColor"
keysAndValues:
@"inputImage", img,
@"inputColor0", [CIColor colorWithCGColor:pointColor.CGColor],
@"inputColor1", [CIColor colorWithCGColor:backgroundColor.CGColor],
nil];
CIImage *qrImage = colorFilter.outputImage;
//绘制
CGImageRef cgImage = [[CIContext contextWithOptions:nil] createCGImage:qrImage fromRect:qrImage.extent];
UIGraphicsBeginImageContext(size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, kCGInterpolationNone);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, CGContextGetClipBoundingBox(context), cgImage);
UIImage *codeImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGImageRelease(cgImage);
return codeImage;
}
添加水印log图片
/**
调整二维码清晰度,添加水印图片
@param img 模糊的二维码图片
@param size 需要的二维码宽高
@param waterImg log图片
@param waterSize log图片的大小
@return 添加log后的二维码
*/
- (UIImage *)getHDImgWithCIImage:(CIImage *)img size:(CGSize)size waterImg:(UIImage *)waterImg waterSize:(CGSize)waterSize {
CGRect extent = CGRectIntegral(img.extent);
CGFloat scale = MIN(size.width/CGRectGetWidth(extent), size.height/CGRectGetHeight(extent));
//1.创建bitmap;
size_t width = CGRectGetWidth(extent) * scale;
size_t height = CGRectGetHeight(extent) * scale;
//创建一个DeviceGray颜色空间
CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
//width:图片宽度像素
//height:图片高度像素
//bitsPerComponent:每个颜色的比特值,例如在rgba-32模式下为8
//bitmapInfo:指定的位图应该包含一个alpha通道。
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext contextWithOptions:nil];
//创建CoreGraphics image
CGImageRef bitmapImage = [context createCGImage:img fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent, bitmapImage);
//2.保存bitmap到图片
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef); CGImageRelease(bitmapImage);
//清晰的二维码图片
UIImage *outputImage = [UIImage imageWithCGImage:scaledImage];
//给二维码加 logo 图
UIGraphicsBeginImageContextWithOptions(outputImage.size, NO, [[UIScreen mainScreen] scale]);
[outputImage drawInRect:CGRectMake(0, 0, size.width, size.height)];
//水印图片
//把水印图片画到生成的二维码图片上,注意尺寸不要太大(根据上面生成二维码设置的纠错程度设置),否则有可能造成扫不出来
[waterImg drawInRect:CGRectMake((size.width-waterSize.width)/2.0, (size.height-waterSize.height)/2.0, waterSize.width, waterSize.height)];
UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newPic;
}