yotiky Tech Blog

とあるエンジニアの備忘録

ZXing を使ってQRコードを動的に生成して表示する

ZXing は "zebra crossing" の略らしく、ゼブラクロッシングと読むのが正解っぽい。

検証環境

導入

nuget で ZXing.NET をインストールします。 System.Drawing.Common も使うので入っていなければ一緒に入れるか、実装する際に要求されます。

github.com

実装

xaml 側に Image を追加します。

<Image x:Name="QrImage" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="10"/>

今回はコードビハインドに処理を追加します。

    var qrCode = new BarcodeWriter
    {
        Format = BarcodeFormat.QR_CODE,
        Options = new QrCodeEncodingOptions
        {
            ErrorCorrection = ErrorCorrectionLevel.M,
            CharacterSet = "ISO-8859-1", // default
            //CharacterSet = "UTF-8", // japanese
            Width = 300,
            Height = 300,
            Margin = 5,
        },
    };

    using (var bmp = qrCode.Write("https://yotiky.hatenablog.com/"))
    using (var ms = new MemoryStream())
    {
        bmp.Save(ms, ImageFormat.Bmp);
        var source = BitmapFrame.Create(ms, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
        QrImage.Source = source;
    }

QRコードの内容に日本語が含まれる場合は、"Shift_JIS" を指定する記事が多くありますが、 Not a supported と言われてしまったので、"UTF-8" を使っておきましょう。

パラメータ

BarcodeFormat

バーコードのフォーマットを取得または設定します。この値は、MultiFormatWriterを使用している場合にのみ有効です。

QR_CODE 以外に、ITF(日本でよく見る所謂バーコード)や一次元、二次元のもの10個以上定義されています。

QrCodeEncodingOptions

プロパティ
Hints すべてのオプションのデータコンテナを取得します。キーとなる EncodeHintType がすべてのプロパティと対になっている。
Height バーコード画像の高さを指定します。
Width バーコード画像の幅を指定します。
PureBarcode 出力画像に内容文字列を入れないでください。
Margin バーコードを生成する際に使用するマージンをピクセル単位で指定します。意味はフォーマットによって異なります。例えば、ほとんどの1Dフォーマットではバーコードの前後のマージンを水平方向に制御します。
GS1Format データを GS1 標準にエンコードするかどうかを指定します。
ErrorCorrectionLevel QRコードなどで使用する誤り訂正の程度を指定します。タイプはエンコーダに依存します。例えば、QRコードの場合はZXing.QrCode.Internal.ErrorCorrectionLevelとなります。
CharacterSet 適用可能な場合に使用する文字エンコーディングを指定します (System.String 型)。
DisableECI QRコード生成時にECIセグメントを明示的に無効にする QRコードの仕様に反していますが、ECIセグメントが必要な状態でISO-8859-1(デフォルト)からUTF-8文字コードが切り替わってしまうと、一部の読者に問題が発生します。このプロパティをtrueに設定すると、UTF-8エンコーディングでECIセグメントが省略されます。
QrVersion エンコードするQRコードの正確なバージョンを指定します。1から40までの整数値。指定したデータが必要なバージョンに収まらない場合は、WriterExceptionがスローされます。

ErrorCorrectionLevel ですが、QRコードは汚れていたり破損していてもデータを復元できる機能を持っていて、どの程度の誤りを訂正できるか指定できるようです。

L = ~7%、M = ~15%、Q = ~25%、H = ~30%、となっており、レベルが高いほど訂正能力が上がり、コードのサイズが大きくなります。

www.qrcode.com

実行

f:id:yotiky:20201011034958p:plain