zxing 二維碼掃描 配置和使用
二維碼掃描使用最多的主要有兩個庫:zbarSDK 和zxing
關於zbar的使用比較簡單,在這裡不多說了,對於zxing的使用就比較麻煩,雖然網上有很多關於zxing的使用方法,不過查了很多中文和英文的貼子。發現說的都不夠詳細,對與像我這樣第一次搞的新手來說差一步就錯了很多!
現在根據自己專案中使用的情況,詳細具體的總結一下如何將ZXing整合到已有的iOS工程中
第一步:首先去Google Code或Github將ZXing的程式碼下載下來(ZXing(Github映象地址)),整個工程比較大,我們只需要其中涉及iOS的部分,所以最好做一些裁剪。簡單來說,我們只需要保留cpp和iphone這2個資料夾,其餘的全部刪掉。如下圖所示:
第二步:裁剪,對於cpp這個目錄,只保留cpp/core/src/zxing下面的內容,其餘內容也可以刪掉了。同樣對iphone這個目錄只需要儲存 iphone/ZXingWidget/下面的內容,但是整個目錄結構必須保持原樣。裁剪完後,整個目錄結構如下所示:
第三步:首先將修該後的zxing上面的開發包(即上面修改後的zxing資料夾),拷貝到你的專案根資料夾下面;
新增檔案到你的工程中,選擇“Add filesto...”,在彈出的框中,找到:你的專案資料夾/zxing/iphone/ZXingWidget下面的ZXingWidget.xcodeproj,選擇"ZXingWidget.xcodeproj",在新增前,請先執行該專案,進行編譯,如果成功,再進行此步新增!
新增成功後項目結構如下圖:
第四步:選擇你的專案--TARGETS--Build Phases---Target Dependencies----然後點選"+"新增“ZXingWidget”。新增後如下圖:
第五步:
同樣,新增frameWorks.方法:Build Phases---Target Dependencies----”Link Binary With Libraries”---點選"+"。新增如下幾項:
libZXingWidget.a
AddressBook
AddressBookUI
AudioToolbox
AVFoundation
CoreMedia
CoreVideo
libiconv.dylib
完成後如下圖:
第六步:後一步,在設定中增加如下2個header search path:
1. BuildSettings --- 2.搜尋"header search paths" --- 3.雙擊"HeaderSearch Paths"
/zxing/iphone/ZXingWidget/Classes
./zxing/cpp/core/src
需要注意的是,第一個path要設定成迴圈查詢子目錄,而第二個不迴圈查詢,如下圖所示:
完成這一步,就已經完成了ZXing庫的整合工作,(如果不做修改的話,zxing暫時只能識別二維碼,不能識別條形碼)
在這裡編譯工程,應該能成功,不會報錯,如果有報錯資訊等,看看是否是少添加了庫,Header Search Paths中的路徑是否正確;
在專案中引用
首先將你使用ZXingWidgetController的檔案的字尾該為.mm, 例如:我在MyZxingViewController.m改為:MyZxingViewController.mm否則在使用的時候會報:xxx filenot found的類似的問題
同時你必須將 #import<ZXingWidgetController.h>新增到你的.h檔案中將
#import <QRCodeReader.h>
#import <MultiFormatOneDReader.h>新增到.mm檔案中,否則也會報iostream file not found類似的問題
MyZxingViewController資料夾中引用
.h
#import <UIKit/UIKit.h> |
#import "ZXingWidgetController.h" |
//#import "QRCodeReader.h"//這個引用在.h檔案中為出錯:iostream file not found |
@interface Contact : UIViewController <ZXingDelegate>{ |
UITextView *resultsView; |
NSString *resultsToDisplay; |
} |
@property (retain, nonatomic) IBOutlet UITextView *resultsView; |
@property (nonatomic, copy) NSString *resultsToDisplay; |
- (IBAction)scanPressed:(id)sender; @end |
修改zxing 使其能掃描條形碼
例子中的程式碼確實只能做二維碼的識別, 不能做條形碼的掃描。 研究了一下又在網上找了一下, 結果發現稍做修改,還是可以讓ZXing支援條形碼和二維碼的同時識別的, 程式碼稍侯就貼出來。本人親自試過,確實可行。
總結地來說, ZBar使用起來比ZXing相對方便一點, 也就是更像是 卡片機與單反相機的區別。但如果需要修改程式碼的話,做一些自定義什麼的,建議使用ZXing, 如果只是想隨便用用的話, 建議使用ZBar.
好,話不多說, 下面說說如何使ZXing改改後可以支援掃條形碼。
1.在- (IBAction)scanPressed:(id)sender方法中:
ZXingWidgetController*widController = [[ZXingWidgetControlleralloc] initWithDelegate:selfshowCancel:YESOneDMode:YES];
MultiFormatOneDReader*OneReaders=[[MultiFormatOneDReader alloc]init];
QRCodeReader* qrcodeReader = [[QRCodeReader alloc] init];
NSSet*readers = [[NSSet alloc] initWithObjects:OneReaders,qrcodeReader,nil];
[qrcodeReader release];[OneReaders release];
2.在ZXingWidgetController.m的(void)captureOutput:(AVCaptureOutput *)captureOutput :方法中,註釋掉以下方法
if(oneDMode) {
// let's just give the decoder a vertical band right above the red line
cropRect.origin.x = cropRect.origin.x + (cropRect.size.width / 2) - (ONE_D_BAND_HEIGHT + 1);
cropRect.size.width = ONE_D_BAND_HEIGHT;
// do a rotate
CGImageRef croppedImg = CGImageCreateWithImageInRect(capture, cropRect);
capture = [selfCGImageRotated90:croppedImg];
capture = [selfCGImageRotated180:capture];
// UIImageWriteToSavedPhotosAlbum([UIImage imageWithCGImage:capture], nil, nil, nil);
CGImageRelease(croppedImg);
cropRect.origin.x = 0.0;
cropRect.origin.y = 0.0;
cropRect.size.width = CGImageGetWidth(capture);
cropRect.size.height = CGImageGetHeight(capture);
}
3. 將上面註釋掉的程式碼向下數大概約20行處的程式碼:UIImage *scrn = [[UIImage alloc] initWithCGImage:newImage]; 改為:int backCameraImageOrientation = UIImageOrientationRight; UIImage *scrn = [[UIImage alloc] initWithCGImage:newImage scale: (CGFloat)1.0 orientation:backCameraImageOrientation];
4. 在OverlayView.m註釋程式碼以下程式碼:
self.oneDMode = isOneDModeEnabled;
然後執行,會發現可掃條形碼了,還可以同時掃二維碼了