CIFilterでQRコードを作ってみた

SwiftでQRCodeを作成する方法としてCIFilterのパラメータにCIQRCodeGenerator を設定してあげることでURLからQRCodeを自動生成することができます。

コード一覧

import CoreImage

class ViewController: UIViewController {

    @IBOutlet weak var qrImageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let url = "http://harumi.sakura.ne.jp/wordpress/"

        guard let data = url.data(using: .utf8) else {
            return
        }

        let qr = CIFilter(name: "CIQRCodeGenerator", parameters: ["inputMessage": data, "inputCorrectionLevel": "H"])!
        qrImageView.image =  UIImage(ciImage: qr.outputImage!)
    }

}

解説

コードの中で何を表しているのかよくわからないパラメータがinputCorrectionLevelだと思いますが、公式の説明にはエラー修正用のパラメータと記載がありました。

このinputCorrectionLevelパラメーターは、出力画像にエンコードされた追加データの量を制御して、エラー修正を提供します。
エラー修正のレベルが高いと、出力画像が大きくなりますが、コードのより大きな領域を損傷したり、隠したりできます。
次の4つの修正モードがあります(対応するエラー回復レベル):

https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIQRCodeGenerator

最小のLと最大のHを比べてみましたが、見た目上の細かさが変わるようです。

どちらのQRコードを読み込んみましたが、はっきりとした違いはわかりませんでした。

L: 7

H: 30

エラーハンドリングについて

QR生成時にクラッシュをする可能性があるのはCIFilterのkey名などが間違っていた場合だけなので、ハンドリング処理は必要ありません。

Data型に変換する文字列がから文字の場合であってもクラッシュすることはなく、読み込むことのできないQRコードが生成されます。

参考文献

SwiftでQRコードを生成してみた

Core Image Filter Reference

前の記事

UILabelにhtmlを適用させる

次の記事

Sketchを使ってみた