2025/11/29

QR コードの作画:#4)作画ライブラリ作成開始

今回からは、いよいよ QR コードの作画(ビットマップファイルの作成)するためのコーディングを開始ます。


QR コードライブラリの準備

まず、QR コードの論理データ(Boolean 型の 2 次元配列)へ変換は、連載『ノーツで QR コード』で作成したスクリプトライブラリ lsQRCode を使用します。連載では、元となった Excel VBA のコードを逐次修正する形で紹介していました。ライブラリの中身を知りたい方は連載をご確認ください。完成したスクリプトライブラリがあればよいという方は MISC Market で無償公開しています。以下のリンクよりダウンロードください。

QR コード変換ライブラリ for LotusScript


◇ 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 次元配列)
2vsFP_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 件のコメント:

コメントを投稿