iOS开发之原生二维码生成
2016-05-06 21:57
561 查看
1.首先在storyboard上拖几个控件:一个UITextField,一个UIButton,一个UIImageView
1.1关联属性
@property (weak,
nonatomic) IBOutlet
UITextField *txt;
@property (weak,
nonatomic) IBOutlet
UIImageView *img;
1.2给 button 添加点击事件
- (IBAction)generate:(UIButton *)sender {
[self.txt
resignFirstResponder];
//1.实例化二维码滤镜
CIFilter *filter = [CIFilter
filterWithName:@"CIQRCodeGenerator"];//CIFilter用来表示CoreImage提供的各种滤镜。滤镜使用键-值来设置输入值,这些值设置好之后,CIFilter就可以用来生成新的CIImage输出图像。这里的输出的图像不会进行实际的图像渲染。
//2.恢复滤镜的默认属性(因为滤镜有可能保存上一次的属性)
[filter setDefaults];
//3.将字符串转化成 NSData
NSData *data = [self.txt.text
dataUsingEncoding:NSUTF8StringEncoding];
//4.通过KVC设置滤镜,传入data,将来滤镜就知道要通过传入的数据生成二维码
[filter setValue:data
forKey:@"inputMessage"];
//5.生成二维码
CIImage *icon = [filter
outputImage];
//CIImage是CoreImage框架中最基本代表图像的对象,他不仅包含元图像数据,还包含作用在原图像上的滤镜链。
// UIImage *image1 = [UIImage imageWithCIImage:icon];
//注:像这样将CIImage直接转换成UIImage生成的二维码会比较模糊,但是简单,也可以扫描出信息。
//6.设置生成号的二维码显示到 imageView上
// self.img.image = image1;
//生成高清二维码图像
self.img.image
= [self
createNonInterpolatedUIImageFormCIImage:icon withSize:100.0];
}
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
CGRect extent =
CGRectIntegral(image.extent);
//设置比例
CGFloat scale =
MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
//
创建bitmap(位图);
size_t width =
CGRectGetWidth(extent) * scale;
size_t height =
CGRectGetHeight(extent) * scale;
CGColorSpaceRef cs =
CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef =
CGBitmapContextCreate(nil, width, height,
8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext
contextWithOptions:nil];
CGImageRef bitmapImage = [context
createCGImage:image fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef,
kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent, bitmapImage);
//
保存bitmap到图片
CGImageRef scaledImage =
CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage
imageWithCGImage:scaledImage];
}
1.1关联属性
@property (weak,
nonatomic) IBOutlet
UITextField *txt;
@property (weak,
nonatomic) IBOutlet
UIImageView *img;
1.2给 button 添加点击事件
- (IBAction)generate:(UIButton *)sender {
[self.txt
resignFirstResponder];
//1.实例化二维码滤镜
CIFilter *filter = [CIFilter
filterWithName:@"CIQRCodeGenerator"];//CIFilter用来表示CoreImage提供的各种滤镜。滤镜使用键-值来设置输入值,这些值设置好之后,CIFilter就可以用来生成新的CIImage输出图像。这里的输出的图像不会进行实际的图像渲染。
//2.恢复滤镜的默认属性(因为滤镜有可能保存上一次的属性)
[filter setDefaults];
//3.将字符串转化成 NSData
NSData *data = [self.txt.text
dataUsingEncoding:NSUTF8StringEncoding];
//4.通过KVC设置滤镜,传入data,将来滤镜就知道要通过传入的数据生成二维码
[filter setValue:data
forKey:@"inputMessage"];
//5.生成二维码
CIImage *icon = [filter
outputImage];
//CIImage是CoreImage框架中最基本代表图像的对象,他不仅包含元图像数据,还包含作用在原图像上的滤镜链。
// UIImage *image1 = [UIImage imageWithCIImage:icon];
//注:像这样将CIImage直接转换成UIImage生成的二维码会比较模糊,但是简单,也可以扫描出信息。
//6.设置生成号的二维码显示到 imageView上
// self.img.image = image1;
//生成高清二维码图像
self.img.image
= [self
createNonInterpolatedUIImageFormCIImage:icon withSize:100.0];
}
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {
CGRect extent =
CGRectIntegral(image.extent);
//设置比例
CGFloat scale =
MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
//
创建bitmap(位图);
size_t width =
CGRectGetWidth(extent) * scale;
size_t height =
CGRectGetHeight(extent) * scale;
CGColorSpaceRef cs =
CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef =
CGBitmapContextCreate(nil, width, height,
8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext
contextWithOptions:nil];
CGImageRef bitmapImage = [context
createCGImage:image fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef,
kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent, bitmapImage);
//
保存bitmap到图片
CGImageRef scaledImage =
CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage
imageWithCGImage:scaledImage];
}
相关文章推荐
- 马化腾亲自“站台” 企业微信和个人微信互通能带来什么?
- 批处理制作二维码生成器
- jQuery qrcode生成二维码的方法
- 使用jquery.qrcode.min.js实现中文转化二维码
- jquery插件qrcode在线生成二维码
- JavaScript生成二维码图片小结
- php制作中间带自己定义图片二维码的方法
- zbar解码二维码和条形码示例
- php使用qr生成二维码的示例分享
- php实现扫描二维码根据浏览器类型访问不同下载地址
- PHP微信开发之二维码生成类
- iOS开发之路--微博“更多”页面
- Jquery 类网页微信二维码图块滚动效果具体实现
- 使用PHP生成二维码的方法汇总
- Perl生成纯HTML代码二维码实例
- Symfony生成二维码的方法
- 基于JavaScript实现生成名片、链接等二维码
- 基于Android实现个性彩色好看的二维码
- Android开发实现模仿360二维码扫描功能实例详解
- Android编程实现二维码的生成与解析