一 生成二維碼
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);