HOME > バーコードスキャン
2Dバーコードをスキャンする
なんと2Dバーコード読み込み機能はAVFoundationに実装されています。
やってみた
標準の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があったので できたんですね。バーコードってもっと複雑な事をしているのかと思っていました。
↓こんな記事もありますよ!
![]() | SqliteのDBファイル保存+レビュー却下2回既にレビューを通過していたアプリが、バイナリレビューで却下されてしまいました。理由は、2.23 Details On launch and content download, your app stores 26.48MB on the user's iCloud, which does not comply with the iOS Data Storage となっていてiCouldに保存される量にしては多いから管理してください、といった旨の内容でした。別に却下理由に難癖つけるつもりではないのですが、最初のレビュー時にいってほしい。。。 |
![]() | AppleWatchとiPhone連携をナターシャさんのデモを参考に調査先日Swiftサラリーマンに関してTwitterでつぶやいてくださっていたまっちょさん に教えていただいたAppleWatchアプリ作成に関する海外のWatchKitのナターシャさんの記事(Architecting Your App for the Apple Watch)を教えていただきました、 動画やプレゼンもあり英語でしたがサンプルコードも付いていて分かりやすかったです! |
![]() | willsetとdidsetでプロパティを監視。意味あるのか???クラスのプロパティにはWillsetとdidsetという監視用の関数があると聞いたのですが、用途は分かるにしても メリットとしてはどういうものなのかなと、うーん、と考えていました。調べていると海外のサイトでは同じように疑問にもつ質問があがっていました。 getとsetで同じことができるのでは?との私と同じスタンスです。解決されていましたので、順に説明していきます。 |
Tweet
![]() |
|||
|