iOS二维码生成
2015-12-25 00:00
447 查看
摘要: 二维码的生成,中间附带小图标
通过上面的代码已经可以生成普通的二维码了,如果就需要黑白的二维码,可以去掉对二维码颜色的处理,如果中间需要加上一个小图标什么的直接覆盖就是了,因为二维码本身是有容错几率的,如果需要给二位码添加阴影使得看起来更加真实可以这样设置:
使用CIFilter生成二维码
- (void)viewDidLoad { //这里的参数str是你二维码所要存储的内容,一般是一个网络链接,也可以是各种信息 UIImage *image = [self QRFromString:@"你的string"]; //这个方法是通过输入rgb三基色来得到你想要的二维码的颜色 UIImage *imageChange = [self imageBlackToTransparent:image withRed:55 andGreen:167 andBlue:67]; //由于通过CIFilter生成的二维码非常模糊,通过缩放比例来增加清晰度 imageView.image = [self image:imageChange scale:10]; } - (UIImage *)QRFromString:(NSString *)string { //1. 需要生成二维码的内容 NSData *stringData = [string dataUsingEncoding:NSUTF8StringEncoding ]; //2. 二维码生成器 CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; //3. 设置输入参数 [filter setValue:stringData forKey:@"inputMessage"]; //4. 设置识别率 [filter setValue:@"M" forKey:@"inputCorrectionLevel"]; //5. 获取生成的图片 CGImageRef cgImage = [[CIContext contextWithOptions:nil] createCGImage:[filter outputImage] fromRect:[[filter outputImage] extent]]; return [UIImage imageWithCGImage:cgImage]; } - (UIImage *)image:(UIImage *)image scale:(CGFloat)scale { CGSize size = image.size; //1. 缩放图片,使生成的二维码变得更清晰 UIGraphicsBeginImageContext(CGSizeMake(size.width * scale, size.width * scale)); CGContextRef context = UIGraphicsGetCurrentContext(); //2. 插值 CGContextSetInterpolationQuality(context, kCGInterpolationNone); //3. 绘制图片 CGContextDrawImage(context, CGContextGetClipBoundingBox(context), image.CGImage); //4. 获取图片 UIImage *preImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); //5. 旋转图片 UIImage *qrImage = [UIImage imageWithCGImage:[preImage CGImage] scale:[preImage scale] orientation:UIImageOrientationDownMirrored]; return qrImage; } void ProviderReleaseData (void *info, const void *data, size_t size){ free((void*)data); } - (UIImage*)imageBlackToTransparent:(UIImage*)image withRed:(CGFloat)red andGreen:(CGFloat)green andBlue:(CGFloat)blue{ const int imageWidth = image.size.width; const int imageHeight = image.size.height; size_t bytesPerRow = imageWidth * 4; uint32_t* rgbImageBuf = (uint32_t*)malloc(bytesPerRow * imageHeight); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate(rgbImageBuf, imageWidth, imageHeight, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast); CGContextDrawImage(context, CGRectMake(0, 0, imageWidth, imageHeight), image.CGImage); // 遍历像素 int pixelNum = imageWidth * imageHeight; uint32_t* pCurPtr = rgbImageBuf; for (int i = 0; i <= pixelNum; i++, pCurPtr++){ if ((*pCurPtr & 0xFFFFFF00) <= 0x99999900) // 将白色变成透明 { // 改成下面的代码,会将图片转成想要的颜色 uint8_t* ptr = (uint8_t*)pCurPtr; ptr[3] = red; //0~255 ptr[2] = green; ptr[1] = blue; } else { uint8_t* ptr = (uint8_t*)pCurPtr; ptr[0] = 0; } } // 输出图片 CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, rgbImageBuf, bytesPerRow * imageHeight, ProviderReleaseData); CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight, 8, 32, bytesPerRow, colorSpace, kCGImageAlphaLast | kCGBitmapByteOrder32Little, dataProvider, NULL, true, kCGRenderingIntentDefault); CGDataProviderRelease(dataProvider); UIImage* resultUIImage = [UIImage imageWithCGImage:imageRef]; // 清理空间 CGImageRelease(imageRef); CGContextRelease(context); CGColorSpaceRelease(colorSpace); return resultUIImage; }
通过上面的代码已经可以生成普通的二维码了,如果就需要黑白的二维码,可以去掉对二维码颜色的处理,如果中间需要加上一个小图标什么的直接覆盖就是了,因为二维码本身是有容错几率的,如果需要给二位码添加阴影使得看起来更加真实可以这样设置:
imageView.layer.shadowOffset = CGSizeMake(0, 0.2); // 设置阴影的偏移量 imageView.layer.shadowRadius = 2; // 设置阴影的半径 imageView.layer.shadowColor = [UIColor blackColor].CGColor; // 设置阴影的颜色 imageView.layer.shadowOpacity = 0.4; // 设置阴影的透明度
相关文章推荐
- IO实时监控iostat命令详解
- IO实时监控iostat命令详解
- IOS开发修改textField的placeholder颜色、大小
- IOS开发textField每四位空一格
- IOS开发CABasicAnimation的基本使用
- IOS开发CAKeyframeAnimation的基本使用与keypath的列举
- IOS单例模式(Singleton)
- IOS中scrollsToTop问题小结
- iOS中Bitcode的介绍及配置
- 捕获异常崩溃日志(iOS)
- iOS 基本图形的绘制 基于bitmap 位图
- IOS美图秀秀(滤镜和涂鸦)和 添加阴影功能
- iOS基础之OC:对象作为对象方法的参数
- iOS开发——单例的实现与使用
- ios程序中的内存分配 栈区堆区全局区
- iOS百度地图开发中遇到的问题
- IOS里的TaggedPointer[NSNumber篇]
- IOS里的TaggedPointer[NSString篇]
- iOS---导航条的一些设置
- 越狱开发:用iosOpenDev配置越狱开发环境 编写第一个hello world