天天看點

二維碼生成與掃描

一 生成二維碼

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