一 生成二维码
20 某些二维码中间有图片,可以直接在p_w_picpathview添加图片居中
//1.创建过滤器
cifilter *filter = [cifilter filterwithname:@"ciqrcodegenerator"];
//2.恢复默认
[filter setdefaults];
//3.给过滤器添加数据
nsstring *str = @"二维码学习"; //也直接输出网址,扫描会自动跳转
nsdata *data = [str datausingencoding:nsutf8stringencoding];
[filter setvalue:data forkey:@"inputmessage"];
//4.获取输出二维码
ciimage *outputimage = [filter outputimage];
//5.显示二维码
self.p_w_picpathview.p_w_picpath = [uiimage p_w_picpathwithciimage:outputimage];
//解决模糊方法
// self.p_w_picpathview.p_w_picpath = [self createnoninterpolateduiimagefromciimage:outputimage withsize:200];
生成二维码解决方法
23 -(uiimage *)createnoninterpolateduiimagefromciimage:(ciimage *)p_w_picpath withsize:(cgfloat)size
{
cgrect extent = cgrectintegral(p_w_picpath.extent);
cgfloat scale = min(size/cgrectgetwidth(extent), size/cgrectgetheight(extent));
//1.创建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:p_w_picpath fromrect:extent];
cgcontextsetinterpolationquality(bitmapref, kcginterpolationnone);
cgcontextscalectm(bitmapref, scale, scale);
cgcontextdrawimage(bitmapref, extent, bitmapimage);
//2.保存bitmap到图片
cgimageref scaledimage = cgbitmapcontextcreateimage(bitmapref);
cgcontextrelease(bitmapref);
cgimagerelease(bitmapimage);
return [uiimage p_w_picpathwithcgimage:scaledimage];
}
二 二维码识别
49 @interface viewcontroller ()<avcapturemetadataoutputobjectsdelegate>
@property (weak, nonatomic)avcapturesession *session;
@property (weak, nonatomic)avcapturevideopreviewlayer *layer;
- (ibaction)scan:(uibutton *)sender {
//1.创建捕捉会话
avcapturesession *session = [[avcapturesession alloc] init];
self.session = session;
//2.设置输入设备 设置为摄像头
avcapturedevice *device = [avcapturedevice defaultdevicewithmediatype:avmediatypevideo];
avcapturedeviceinput *inputdevice = [avcapturedeviceinput deviceinputwithdevice:device error:nil];
[session addinput:inputdevice];
//3.设置输出方式 代理数据输出数据
avcapturemetadataoutput *output = [[avcapturemetadataoutput alloc] init];
[output setmetadataobjectsdelegate:self queue:dispatch_get_main_queue()];
[session addoutput:output];
[output setmetadataobjecttypes:@[avmetadataobjecttypeqrcode]];
//4.添加一个显示的layer 类似摄像头拍照阅览
avcapturevideopreviewlayer *layer = [[avcapturevideopreviewlayer alloc] initwithsession:session];
layer.frame = self.view.bounds;
[self.view.layer addsublayer:layer];
self.layer = layer;
//5.开始扫描
[session startrunning];
-(void)captureoutput:(avcaptureoutput *)captureoutput didoutputmetadataobjects:(nsarray *)metadataobjects fromconnection:(avcaptureconnection *)connection
if (metadataobjects.count > 0) {
//1.获取扫描结果
avmetadatamachinereadablecodeobject *object = [metadataobjects lastobject];
self.outlabel.text = object.stringvalue;
//2.停止扫描
[self.session stoprunning];
//3.移除图层
[self.layer removefromsuperlayer];
}else{
nslog(@"没有扫描到数据");
}
三 zbarsdk的使用
导入必要的框架
1).快速集成
实现zbarreaderdelegate协议
35 //二维码识别
-(void)sysbutbuttonclick{
//初始化相机控制器
zbarreaderviewcontroller *reader = [zbarreaderviewcontroller new];
//设置代理
reader.readerdelegate = self;
//基本适配
reader.supportedorientationsmask = zbarorientationmaskall;
//二维码/条形码识别设置
zbarimagescanner *scanner = reader.scanner;
[scanner setsymbology: zbar_i25
config: zbar_cfg_enable
to: 0];
//弹出系统照相机,全屏拍摄
[self presentviewcontroller:reader animated:yes completion:nil];
- (void) p_w_picpathpickercontroller: (uiimagepickercontroller*) reader
didfinishpickingmediawithinfo: (nsdictionary*) info
{
nslog(@"info=%@",info);
// 得到条形码结果
id<nsfastenumeration> results =[info objectforkey: zbarreadercontrollerresults];
zbarsymbol *symbol = nil;
for(symbol in results)
// example: just grab the first barcode
break;
nslog(@"%@",symbol.data);
2).自定义窗口
实现zbarreaderviewdelegate协议
38 //二维码识别
//初始化照相机窗口
zbarreaderview *readview = [zbarreaderview new];
//自定义大小
readview.frame = myscreen;
//自定义添加相关指示.........发挥各自的app的想象力
//此处省略美化10000行代码...................
//………………………..
// 好进入正题—— 接着设置好代理
readview.readerdelegate = self;
//将其照相机拍摄视图添加到要显示的视图上
[self.view addsubview:readview];
zbarimagescanner *scanner = readview.scanner;
//启动,必须启动后,手机摄影头拍摄的即时图像菜可以显示在readview上
[readview start];
-(void)readerview:(zbarreaderview *)readerview didreadsymbols:(zbarsymbolset *)symbols fromimage:(uiimage *)p_w_picpath
zbarsymbol *symbol = nil;
for (symbol in symbols) {
break;
nslog(@"========%@==========",symbol.data);