Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


Delphi オープンソースを利用した二次元バーコード(QRコード)生成

弊社テクニカルサポートに頂く質問の中には
「バーコードや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コード」は株式会社デンソーウェーブの登録商標です。