酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

iOSでCIFilterを使ってバーコードを生成する

iOS/AndroidアプリでCode128のバーコードを生成する必要がでてきました。iOS 8.0くらいから標準APIだけで二次元コードの読み取りと生成ができるようになっていたようです。

昔からバーコード生成といえばZXingみたいなところがありましたよね。遡って調べてみると僕は7年くらい前からバーコードの読み取りと生成を繰り返してきたようです。

今回の内容はAppleのドキュメントに記載されています。

バーコードの生成する

特に難しいことはしないのでサンプルコードをそのまま貼ります。

import Foundation
import UIKit
import CoreImage

static func generateCode128Barcode(string: String) -> UIImage? {
    guard let data = string.data(using: .utf8) else {
        return nil
    }
    
    guard let filter = CIFilter(name: "CICode128BarcodeGenerator") else {
        return nil
    }
    
    filter.setDefaults()
    filter.setValue(data, forKey: "inputMessage")
    
    guard let output = filter.outputImage else {
        return nil
    }
    
    let context = CIContext(options: nil)
    guard let cgImage = context.createCGImage(output, from: output.extent) else {
        return nil
    }
    
    let image = UIImage(cgImage: cgImage, scale: 2.0, orientation: UIImageOrientation.up)
    
    return image
}

生成結果

下図のように表示されます。

f:id:ch3cooh393:20171025231700p:plain

CIFilter(name: "CICode128BarcodeGenerator")の部分をCIQRCodeGeneratorに変えることでQRコードも生成することができます。

f:id:ch3cooh393:20171025232001p:plain

ポケモンでは色々なQRコードを読み取る「島スキャン」というミニゲームがあって、毎回異なるQRコードを読む必要があります。このAPIを使って無限にランダムなQRコードを生成することで楽に島スキャンすることができそうです。