Swift転職なら=>【LevTech】
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

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

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があったので できたんですね。バーコードってもっと複雑な事をしているのかと思っていました。

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

Facebook SDKを試してみる(調査)

先日ひょんなところからFacebookSDKの事を教えていただき、興味が足裏からフツフツと湧き出てまいりましたので本日調査してみます。

NSThreadでスレッド処理を行う

タイマー処理と同様に利用できるスレッドの処理です。NSTimerではヒゲがのびたサンプルでしたので眉毛の濃くなるサンプルにしてみます。ただ、どうやらThread処理は 推奨されておらず、dispatch_queueを使用するべきのようです。

UITextViewやらで縦書きができないか検証

「文字の縦書き」をやってみたいのですが、どうもUITextView等には設定が無いとのことです。 調べていると、本当にない?のかな。少し調査して作れそうなもんであればつくってみれたら、、、との気持ちで進めてみます。
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!