弊社テクニカルサポートに頂く質問の中には
「バーコードやQRコードを生成して、画面に表示したり帳票にセットしたい」
というものが一定数あります。
今回はオープンソースのロジックを使用して、QRコードの画像を生成する方法をご紹介します。
今回使用するオープンソースのロジックはこちらになります。
GitHub – foxitsoftware / DelphiZXingQRCode
まずは上記サイトからzipファイルをダウンロードします。
(「Code」ボタンから「Download ZIP」をクリック)
zipを解凍した中にある「DelphiZXIngQRCode.pas」をプロジェクトに追加するか、
プロジェクトファイル(*.dpr)と同じフォルダ内にコピーします。
次にDelphi側でプロジェクトを新規作成し、QRコードを出力させるユニット側では
uses節に「DelphiZXIngQRCode」を追加し、以下のようにロジックを記述します。
以下のロジックはEdit1に入力された文字列をQRコードの画像化し、
EXEと同階層に「QR_ 入力された文字列.bmp」というビットマップを出力するサンプルとなります。
{******************************************************************************* 目的: 生成ボタン押下時処理 引数: 戻値: *******************************************************************************} procedure TForm1.Button1Click(Sender: TObject); const cBAI = 4; // 画像拡大時の倍率(1以上の整数を指定) ※1 var qr: TDelphiZXingQRCode; // QR処理クラス iCols, iRows: Integer; // for文用 sSAVE: String; // 保存時のファイル名 bmp1: TBitmap; // QR生成用ビットマップ bmp2: TBitmap; // QR保存用ビットマップ begin qr := TDelphiZXingQRCode.Create; bmp1 := TBitmap.Create; bmp2 := TBitmap.Create; try qr.Data := Edit1.Text; qr.Encoding := qrUTF8BOM; // 英数字が混在することがある場合の指定値 ※2 bmp1.Width := QR.Columns; bmp1.Height := QR.Rows; bmp2.Width := cBAI * QR.Columns; bmp2.Height := cBAI * QR.Rows; for iCols:=0 to QR.Columns-1 do begin for iRows:=0 to QR.Rows-1 do begin // 描画処理 if QR.IsBlack[iRows, iCols] then begin bmp1.Canvas.Pixels[iCols, iRows] := clBlack; end else begin bmp1.Canvas.Pixels[iCols, iRows] := clWhite; end; end; end; // この時点でbmp1には等倍の画像が出来ているため、拡大処理 ※1 if (cBAI > 1) then begin bmp2.Canvas.StretchDraw(Rect(0, 0, bmp2.Width, bmp2.Height), bmp1); end else begin bmp2.Assign(bmp1); end; // 結果を画面のTImageに表示 Image1.Picture.Assign(bmp2); // ファイル名に使えない文字を除去 ※3 sSAVE := 'QR_' + Edit1.Text + '.bmp'; sSAVE := StringReplace(sSAVE, '\', '', [rfReplaceAll]); sSAVE := StringReplace(sSAVE, '/', '', [rfReplaceAll]); sSAVE := StringReplace(sSAVE, ':', '', [rfReplaceAll]); sSAVE := StringReplace(sSAVE, '*', '', [rfReplaceAll]); sSAVE := StringReplace(sSAVE, '?', '', [rfReplaceAll]); sSAVE := StringReplace(sSAVE, '<', '', [rfReplaceAll]); sSAVE := StringReplace(sSAVE, '>', '', [rfReplaceAll]); sSAVE := StringReplace(sSAVE, '|', '', [rfReplaceAll]); // EXEと同階層に「QR_元の文字列.bmp」という名前で保存 bmp2.SaveToFile(ExtractFilePath(ParamStr(0)) + sSAVE); finally FreeAndNil(qr); FreeAndNil(bmp1); FreeAndNil(bmp2); end; end;
※1:TDelphiZXingQRCodeで出力される画像は1ドットが1ピクセルの小さな画像になるため、倍率を指定することでスマートフォンなどのカメラで読み取りやすくするように拡大します。
※2:初期値は自動(qrAuto)が設定されていますが、日本語環境で正しく出力されない場合があるためUTF-8文字列として出力します。
※3:Windowsがファイル名で使用できない文字(半角の \ / : * ? < > | )が含まれていると保存時にエラーになるため、これらを除いた文字列を保存時のファイル名にします。
出力された画像は、TImageに読み込ませて画面内に表示したり、
FastReport・VB-Report等の帳票ツールに読み込ませて印刷したり、活用方法は様々です。
※「QRコード」は株式会社デンソーウェーブの登録商標です。