iOS 使用CIFilter生成二维码
2015-12-03 16:19
609 查看
iOS7之前,二维码的制作多使用第三方库,比如ZBarSDK等,iOS7之后,可以使用原生的CIFilter生成二维码。
首先需要创建一个imageview来显示二维码:
ok,这样生成的二维码就好看多了!
首先需要创建一个imageview来显示二维码:
_qrCodeSizeImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0,150, 150)]; _qrCodeSizeImageView.center = CGPointMake(EEOScreenWidth/2, EEOScreenHeight/2); _qrCodeSizeImageView.image = [self generateQRCode:@"大帅哥" width:self.qrCodeSizeImageView.frame.size.width height:self.qrCodeSizeImageView.frame.size.height]; [self.view addSubview:_qrCodeSizeImageView];现在开始生成二维码,宽高也可根据自己需要设置:
- (UIImage *)generateQRCode:(NSString *)code width:(CGFloat)width height:(CGFloat)height { // 生成二维码图片 CIImage *qrcodeImage; NSData *data = [code dataUsingEncoding:NSISOLatin1StringEncoding allowLossyConversion:false]; CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; [filter setValue:data forKey:@"inputMessage"]; //设置内容 [filter setValue:@"H" forKey:@"inputCorrectionLevel"]; //设置纠错级别,H为最高 qrcodeImage = [filter outputImage]; // 消除模糊 CGFloat scaleX = width / qrcodeImage.extent.size.width; // extent 返回图片的frame CGFloat scaleY = height / qrcodeImage.extent.size.height; CIImage *transformedImage = [qrcodeImage imageByApplyingTransform:CGAffineTransformScale(CGAffineTransformIdentity, scaleX, scaleY)]; return [UIImage imageWithCIImage:transformedImage]; }这样,一个简单的二维码已经生成,但是生成的二维码只是黑白,在某些时候就需要对生成的二维码进行着色,使用遍历像素的方式改变图片颜色,具体如下:
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; }
ok,这样生成的二维码就好看多了!
相关文章推荐
- iOS LLDB调试器和断点调试
- iOS9 之3DTouch 入门
- iOS开发之旅--消息分发详解
- iOS开发之iOS程序偏好设置(Settings Bundle)的使用
- iOS-数据持久化-属性列表
- iOS Crash文件的解析(一)
- [ios][opengles]OpenGL ES基础知识简介
- iOS导航栏使用
- 如何设计一个 iOS 控件?(iOS 控件完全解析)
- iOS唯一设备标识策略
- IOS 模拟器中键盘弹起
- IOS开发-OC基本语法(1)
- iOS-数据持久化基础-沙盒机制
- iOS-数据持久化详细介绍
- ios 学习笔记(三)
- iOS客户端公共WIFI解决方案
- iOS——属性的属性
- iOS提交后申请加急审核
- iOS--界面传值 通知模式(广播)
- 【iOS】字号问题