↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > バーコードスキャン

2Dバーコードをスキャンする

サンプル画像

なんと2Dバーコード読み込み機能はAVFoundationに実装されています。

参考:bowst/barcode_scanner_demo

やってみた

標準のAVFoundationを利用しますので結構簡単に実装可能です。カメラが起動してバーコードを読み込ませると番号のログが表示されます


import UIKit
import AVFoundation

class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
    
    let session: AVCaptureSession = AVCaptureSession()
    var prevlayer: AVCaptureVideoPreviewLayer!
    var hview: UIView = UIView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //準備(サイズ調整、ボーダーカラー、カメラオブジェクト取得、エラー処理)
        self.hview.autoresizingMask =   UIViewAutoresizing.FlexibleTopMargin |
            UIViewAutoresizing.FlexibleBottomMargin |
            UIViewAutoresizing.FlexibleLeftMargin |
            UIViewAutoresizing.FlexibleRightMargin
        self.hview.layer.borderColor = UIColor.greenColor().CGColor
        self.hview.layer.borderWidth = 3
        self.view.addSubview(self.hview)
        let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
        var error : NSError? = nil
        
        //インプット
        let input : AVCaptureDeviceInput? = AVCaptureDeviceInput.deviceInputWithDevice(device, error: &error) as? AVCaptureDeviceInput
        if input != nil {
            session.addInput(input)//カメラインプットセット
        }else {
            println(error)
        }
        
        //アウトプット
        let output = AVCaptureMetadataOutput()
        output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
        session.addOutput(output)//プレビューアウトプットセット
        output.metadataObjectTypes = output.availableMetadataObjectTypes
        prevlayer = AVCaptureVideoPreviewLayer.layerWithSession(session) as AVCaptureVideoPreviewLayer
        prevlayer.frame = self.view.bounds
        prevlayer.videoGravity = AVLayerVideoGravityResizeAspectFill
        self.view.layer.addSublayer(prevlayer)
        
        session.startRunning()//開始!
        
    }
    
    //バーコードが見つかった時に呼ばれる
    func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
        
        var highlightViewRect = CGRectZero
        var barCodeObject : AVMetadataObject!
        var detectionString : String!
        
        //対応バーコードタイプ
        let barCodeTypes = [AVMetadataObjectTypeUPCECode,
            AVMetadataObjectTypeCode39Code,
            AVMetadataObjectTypeCode39Mod43Code,
            AVMetadataObjectTypeEAN13Code,
            AVMetadataObjectTypeEAN8Code,
            AVMetadataObjectTypeCode93Code,
            AVMetadataObjectTypeCode128Code,
            AVMetadataObjectTypePDF417Code,
            AVMetadataObjectTypeQRCode,
            AVMetadataObjectTypeAztecCode
        ]
        
        //複数のバーコードの同時取得も可能
        for metadata in metadataObjects {
            for barcodeType in barCodeTypes {
                if metadata.type == barcodeType {
                    barCodeObject = self.prevlayer.transformedMetadataObjectForMetadataObject(metadata as AVMetadataMachineReadableCodeObject)
                    highlightViewRect = barCodeObject.bounds
                    detectionString = (metadata as AVMetadataMachineReadableCodeObject).stringValue
                    self.session.stopRunning()
                    break
                }
            }
        }
        println(detectionString)
        self.prevlayer.frame = highlightViewRect
        self.view.bringSubviewToFront(self.hview)
    }
}

バーコードの種類って一種類じゃないんですよね、、、結構沢山。郵便局や佐川やクロネコヤマトの荷札のバーコードはNW-7のようです。うーん 奥が深いですね。こちら色んな種類のバーコードと読みとり機器が載っているサイトです。(バーコードの種類と特徴)

まとめ

iOSで2次元バーコードを読み取れるかできないだろうと思っていたのでスンナリ読み込めましたので びっくりしました。以前読み込む仕事があったのですが「できません」といった記憶が、、、、手元にiPhoneがあったので できたんですね。バーコードってもっと複雑な事をしているのかと思っていました。

↓こんな記事もありますよ!


2021-05-14 14:21:41

WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。

AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、 昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は...

2021-05-06 14:04:37

LINEのアニメーションスタンプ制作の落とし穴、、、失敗談

ゴールデンウィークにLINEスタンプを作成してみました。 作り切って申請も通したんですが、意図したアニメーションと違う、、、、 LINEクリエーターの画面だと、アニメーションのプレビュー...

2021-05-01 18:05:35

久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。

忘れないようにメモ エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。 ターゲット→ex...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!