天天看点

二维码生成与扫描

一 生成二维码

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);