1. 程式人生 > >zxing 二維碼掃描 配置和使用

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;
然後執行會發現可掃條形碼了還可以同時掃二維碼了