ASCII倶楽部

このページの本文へ

Swift Playgroundsで学ぶiOSプログラミング 第63回

ジェネレーターカテゴリーのCore Imageフィルターを利用

QRコードを生成するプログラム

2017年11月29日 17時00分更新

文● 柴田文彦 編集●吉田ヒロ

  • この記事をはてなブックマークに追加
  • 本文印刷

 このところ、Core Imageのフィルターを使ったプログラムに取り組んでいます。iPadの内蔵カメラで撮影した画像の処理から始めて、前回はCore Imageフィルターの一覧表と個々のフィルターの説明を表示するプログラムを作りました。

 それらのフィルターの中に「ジェネレーター(CICategoryGenerator)」というカテゴリーがあったことにお気づきでしょうか。これらは文字どおり画像を「生成」するものです。入力された画像を加工するのではなく、言ってみれば何もないところから新しい画像を生み出すというわけです。とはいえ、まったく何もなければ、どんな画像を生成してよいのかもわかりません。これらのフィルターは、数字や文字列で与えられたパラメーターを頼りに画像を生成します。例えば、ストライプや格子模様、ランダムなノイズ、輝く星や太陽のように見えるパターンもあります。しかし、最も興味深いのは、数字や文字列を入力して、バーコードや2次元バーコードを生成するものでしょう。

 今回は、簡単な格子模様から始めて、バーコード、さらにQRコードの名称で知られている2次元バーコードの生成方法を確認します。そして、ユーザーが文字列を入力すると、それを2次元バーコードに変換して表示するアプリ的なプログラムまでを作成します。

各種のパターンを生成して、プレイグラウンドで確認

 Core Imageフィルターのジェネレーターには、ノイズのように何もパラメータを指定できないものもありますが、スプライトや格子のように、いくつかのパラメータを指定してパターンを調整できるものもあります。ただし、それらにもデフォルトのパラメータが決まっていて、何も指定しなくても、それなりの出力が得られるようになっています。

 とりあえず、格子模様を発生するCICheckerboardGeneratorを使ってみましょう。

最小限のプログラムでCore Imageフィルターを使って、格子模様(チェッカーボード)の画像を生成しています。ここでは、出力画像を600×400ポイントの大きさに制限しています

 このCheckerboardもそうですが、ジェネレーターには、出力画像の大きさが決まっていないものがいくつかあります。それらは合成用のパターンとして使うことが多いので、内部では理論的に無限の大きさの画像となっているようです。ただし、それらを目に見える画像として取り出す際には、それでは困ります。そこで、その無限の画像の一部を切り出すために、CIImageクラスのcroppedメソッドを使っています。

 このプログラムを動かして、最後の行の右端に表示される画像アイコンをタップすると、格子模様が生成されたことが確認できるでしょう。

フィルターによって生成した画像は、プレイグラウンドのデバッグ機能を使って表示させて確認します。ちょっと大きめの白黒の格子になっています。このフィルターでは格子の間隔や色なども指定できます

 次にバーコードを生成する、CICode128BarcodeGeneratorを試しましょう。これは、現在全世界で広く使われているGS1-128と呼ばれるコードの元になった、Code128仕様のバーコードを作るものです。ASCIIコードにあるアルファベット、数字、制御文字のすべて(128文字)を表現できます。この例では、「Ascii Club 2017」という文字を、inputMessageという名前の入力パラメータとして指定しています。

アルファベットや数字、記号など、全部で128文字が表現可能なCode128のバーコードを生成するためのプログラムです。入力のパラメータとして指定した「Ascii Club 2017」をバーコードに変換します

 このプログラムも、特に画像を画面に表示するための機能は記述していないので、プレイグラウンドのデバッグ機能を使って確認しましょう。

上の格子模様の例と同じように、プレイグラウンドのデバッグ機能を使って、生成されたバーコードを確認します。宅配の伝票などで見慣れたタイプのコードパターンです

 見た目はごく普通のバーコードです。なお、バーコードの画像は必然的に大きさが決まるので、フィルターの出力をそのまま画像データとして扱うことができます。

 そして、いよいよ2次元バーコードを生成するCIQRCodeGeneratorを試します。2次元バーコードは、URLを表現するために使われることが多いのですが、UTF-8などでエンコードすれば、日本語や絵文字なども、問題なく表現できます。

今回の目的である2次元バーコードを生成するフィルターを使い、日本語と絵文字からなる文字列を入力として指定しています。文字列にはUTF-8のエンコーディングを指定しています

 プログラムのかたちは、UTF-8を指定している部分を除けば、前のバーコードの例とまったく同じです。この結果も、プレイグラウンドで確認しましょう。

結果の2次元バーコードは、やはりプレイグラウンドのデバッグ機能で確認できます。「ビューアを追加」をタップして、コードの下にプレビューを表示すれば、もっと大きな画像で2次元バーコードを確認することも可能です

カテゴリートップへ

この連載の記事

週間ランキングTOP5

ASCII倶楽部会員によく見られてる記事はコレだ!

ASCII倶楽部の新着記事

会員専用動画の紹介も!