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だと思いますが、公式の説明にはエラー修正用のパラメータと記載がありました。
この
https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIQRCodeGeneratorinputCorrectionLevel
パラメーターは、出力画像にエンコードされた追加データの量を制御して、エラー修正を提供します。
エラー修正のレベルが高いと、出力画像が大きくなりますが、コードのより大きな領域を損傷したり、隠したりできます。
次の4つの修正モードがあります(対応するエラー回復レベル):
最小のLと最大のHを比べてみましたが、見た目上の細かさが変わるようです。
どちらのQRコードを読み込んみましたが、はっきりとした違いはわかりませんでした。
L: 7
H: 30
エラーハンドリングについて
QR生成時にクラッシュをする可能性があるのはCIFilterのkey名などが間違っていた場合だけなので、ハンドリング処理は必要ありません。
Data型に変換する文字列がから文字の場合であってもクラッシュすることはなく、読み込むことのできないQRコードが生成されます。