今回からは、いよいよ QR コードの作画(ビットマップファイルの作成)するためのコーディングを開始ます。
QR コードライブラリの準備
まず、QR コードの論理データ(Boolean 型の 2 次元配列)へ変換は、連載『ノーツで QR コード』で作成したスクリプトライブラリ lsQRCode を使用します。連載では、元となった Excel VBA のコードを逐次修正する形で紹介していました。ライブラリの中身を知りたい方は連載をご確認ください。完成したスクリプトライブラリがあればよいという方は MISC Market で無償公開しています。以下のリンクよりダウンロードください。
◇ QR コードの論理データについて
lsQRCode ライブラリが出力する QR コードの論理データについて補足します。
変数宣言は Boolean 型の 2 次元配列となっており、1 次元目が幅で、2次元目が高さとなります。画像サイズの取得方法は次の通りです。
| 横幅 | UBound(vabQR, 1) + 1 |
| 高さ | UBound(vabQR, 2) + 1 |
要素番号が 0 始まりなので + 1 しています。数と要素番号を混同しないように注意しましょう。
作画ライブラリの作成
まず、新規で作成したデータベースに先ほどのライブラリ lsQRCode を配置します。
続いて、新しいライブラリ lsDrawQRcode を新規作成します。このライブラリが、QR コードを作画するライブラリとなります。lsQRCode が出力した QR コードの論理データから QR コードのビットマップファイル作成するコードを記述することになります。
ライブラリ lsQRCode を呼び出し、NotesSession を初期化した状態からスタートとします。
|
Option Declare Use "lsQRcode" ' QR コードの論理データ(Boolean 型の 2 次元配列)変換 Private xns As NotesSession Sub Initialize Set xns = New NotesSession End Sub |
メインルーチンの処理
ビットマップファイルを出力するには、バイナリデータをファイルに書き込む必要があります。その操作は NotesStream クラスを使用するのが便利です。書き込みには Write メソッドを使用するのですが、ファイルを前から順に書き込む必要があります。
ビットマップの仕様には QR コードのサイズにより可変となる項目があります。画像の幅と高さは QR コード論理データ配列の要素数から取得できますが、画像データのサイズ(バイト数)は不明です。事前に算出しておかないと、すべての項目が埋められません。
| ブロック | 項目 |
| ファイルヘッダ | ファイルサイズ |
| 情報ヘッダ | 画像の幅、画像の高さ、画像データサイズ |
| 画像データ | ファイルサイズ、画像データサイズを知るために必要 |
そこで、今回作成するメインルーチンでは、まず、画像データ部を生成する関数を実行しています。これで、ファイルヘッダ、情報ヘッダに設定する値が決定できます。
メインルーチンの作成
作成する関数インターフェースは次の通りです。
◇ 引数
| 1 | vabQR | Variant | QR コードの論理データ (Boolean 型の 2 次元配列) |
| 2 | vsFP_BMP | String | 出力するファイル名 |
◇ 戻り値
| Boolean | ファイル出力ができたら True |
コードの全体は次の通りです。
|
%REM QR コードの論理データ(Boolean 型の 2 次元配列)からビットマップファイルを作成します。 ◆ 引数 vabQR Boolean QR コードの論理データ(Boolean 型の 2 次元配列) vsFP_BMP String フルパスで指定されたファイル名 ◆ 戻り値 Booelan ファイルが作成出来れば True %END REM Public Function DrawQR_BMP(vabQR As Variant, ByVal vsFP_BMP As String) As Boolean Dim nst As NotesStream Dim avBitMap As Variant ’画像データ Dim s As String On Error GoTo Err_General Set nst = xns.CreateStream() If nst.Open(vsFP_BMP, "binary") Then '画像データ部の変換 ReDim avBitMap(UBound(vabQR, 2)) '保存エリア確保 Call xBMP_MakePictureData(vabQR, avBitMap) 'ファイルの中身をいったん削除 Call nst.Truncate() '① ファイルヘッダの出力 Call xBMP_WriteFileHeader(nst, avBitMap) '② 情報ヘッダの出力 Call xBMP_WriteInfoHeader(nst, vabQR, avBitMap) '③ カラーパレットの出力 Call xBMP_WriteColorPallet(nst) '④ 画像データの出力 Call xBMP_WritePictureData(nst, avBitMap) '保存 Call nst.Close() '戻り値セット DrawQR_BMP = True End If Exit_Func: Exit Function Err_General: DrawQR_BMP = False s = "DrawQR_BMP でエラーが発生しました。" & Chr(10) s = s & Error$ & " (Err = " & CStr(Err) & ", Erl = " & CStr(Erl) & ")" MsgBox s, 16, "DrawQR_BMP" Resume Exit_Func End Function |
① ~ ④ までがビットマップデータの各ブロックをファイル出力する関数です。事前に出力データがそろっているので、ファイルフォーマットに従い出力させるだけの役割となります。
次回の予定
メインルーチンからコールしているサブ関数の詳細は次回以降に順次紹介します。次回は、画像データ部を生成する関数 xBMP_MakePictureData を紹介します。
| 前回 | QR コードの作画 | 次回 |

0 件のコメント:
コメントを投稿