> 作業効率UP!! オススメのモバイルモニターを紹介

【C#】QRコードを作成するならコレ!ZXing.NETの使い方

当ページのリンクには広告が含まれています。
  • URLをコピーしました!

C#を用いて、アプリケーションの画面にQRコードを表示したい時に使えるのが「Zxing.NET」です。これを使えば簡単にQRコードを初め、様々なバーコードを生成することができます。

本記事では、Zxing.NETでQRコードを生成する関数を記述しています。また、その関数を使って、アプリ画面にQRコードを表示したり、画像ファイルとして保存するサンプルを記述していますので、是非参考にしてみてください。

記事の内容

QRコードについて

まずはQRコードのおさらいをします。
高速読み取りを重視したマトリクス型2次元コードとして、1994年に株式会社デンソーウェーブにより開発されました。「QR」は Quick Responseの頭字語であり、高速読み取りを目的の一つとしている名称です。

仕様

QRコードを構成する最小の単位をセルといいます。
このセルの組み合わせでQRコードはできており、入力データの情報を初め、バージョンや誤り訂正レベル、マスクパターンに関する情報等も含めています。位置の検出用に配置される3隅の四角い切り出しシンボルが特徴的です。

また、QRコードの大きさはセルのサイズが大きくなると大きくなり、QRコードに入力する文字数が多くなると、QRコードを構成するセル数が多くなるのでサイズは大きくなります。

ZXing.NETについて

ZXing.NETは、ゼブラクロッシングドットネットと呼びます。JavaベースのZXingを.NET Framework用に移植したもので、パッケージはNuGetで公開されています。このパッケージは1次元/2次元のバーコードを生成するだけでなく、1次元/2次元のバーコードに入力された文字列を認識することも可能です。

また、オープンソースになるのでGithubにソースファイルが公開されています。

GitHub
GitHub - micjahn/ZXing.Net: .Net port of the original java-based barcode reader and generator librar... .Net port of the original java-based barcode reader and generator library zxing - GitHub - micjahn/ZXing.Net: .Net port of the original java-based barcode reade...

ZXing.NETを使う方法

NuGetからパッケージをダウンロード

Microsoft Visual Studioから任意のプロジェクトを開きます。ソリューションエクスプローラーの中にあるプロジェクト名を選択して右クリックをすると、表示される項目の中にある「NuGetパッケージの管理(N)…」をクリックします。

NuGetパッケージマネージャーが開くので、検索欄に「ZXing」と入力して検索します。検索結果一覧の中にある「ZXing.NET」を選択して、パッケージをインストールします。

サンプル作成時にインストールした安定版のバージョンは、0.16.6でした(2021年9月現在)。

名前空間の参照先追加

続いて異なる名前空間に定義されているクラスを使用できるように、ファイルの先頭でusingディレクティブを記述します。この記述を行うことで、コードの入力手間を省くことができます。
using ZXing;
using ZXing.QrCode;
using ZXing.QrCode.Internal;
using System.Drawing.Imaging;
using System.IO;

QRコード生成用の関数作成

まずはサンプルを記述しています。バーコードを生成する関数は以下の通りです。
private BitmapFrame QRcodeCreate(string code)
{
    var qrCode = new BarcodeWriter
    {
        // バーコードの種類を選択
        Format = BarcodeFormat.QR_CODE,
        // QRコードのオプション設定
        Options = new QrCodeEncodingOptions
        {
            QrVersion = 5,
            ErrorCorrection = ErrorCorrectionLevel.M,
            CharacterSet = "UTF-8",
            Width = 200,
            Height = 200,
            Margin = 5,
        },
    };

    //QRコード生成
    BitmapFrame qrbmp;
    using (var bmp = qrCode.Write(code))
    using (var ms = new MemoryStream())
    {
        bmp.Save(ms, ImageFormat.Bmp);
        qrbmp = BitmapFrame.Create(ms, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
    }

    return qrbmp;
}

バーコードを作成する関数では、ZXingのBarcodeWriterクラスを使用しますので、newキーワードでインスタンスを生成します。この時、バーコードの種類とオプションを初期化します。

バーコードの種類はQRコードなので、 Format  BarcodeFormat.QR_CODE にします。

 QrCodeEncodingOptions では、次の情報を指定してバーコードの詳細設定を行います。QRコードのバージョン情報を指定しない場合、自動でバージョンが選択されます。

  1. QRコードのバージョン情報
  2. 誤り訂正レベル
  3. 入力文字列のエンコーディング
  4. 作成するバーコードのサイズ(幅)
  5. 作成するバーコードのサイズ(縦)
  6. バーコードの余白

    BarcodeWriterのwriteメソッドは、バーコードに入力する文字列を引数に指定して、バーコード画像ファイルの出力処理を実施します。

    オプションの詳細

    QrCodeEncodingOptionsで設定できるプロパティは以下の通りです。

    QrVersion QRコードに入力する正確なバージョンを指定します。1から40までの整数値を指定できます。例えば英数字を20桁、誤り訂正レベルをHにした場合、バージョンは2になります。
    ErrorCorrectionLevel QRコードの誤り訂正レベルを指定します。L=7%、M=15%、Q=25%、H=30%、となっており、レベルが高いほど訂正能力が上がり、QRコードのサイズが大きくなります。
    Height バーコード画像の高さを指定します。
    Width バーコード画像の幅を指定します。
    Margin バーコードを生成する際に使用するマージンをピクセル単位で指定します。
    PureBarcode 入力文字列の表示有無を選択します。
    GS1Format
    データを GS1 (流通コードの管理及び流通標準に関する国際機関)にエンコードするかどうかを指定します。
    CharacterSet バーコードに入力する文字列の文字エンコーディングを指定します。

      QRコードの仕様に合わせて、これらのプロパティを設定します。

      サンプル使用例

      上記で説明したサンプルソースコードを使用して、WPFでQRコードを生成するアプリケーションを作成してみます。

      QRコードに入れる文字列を入力欄に入力して、生成ボタンをクリックすれば、生成されたQRコードの画像データが表示されます。画面はマテリアルデザインを適用させてオシャレな画面に仕上げました。


      マテリアルデザインの適用方法については、以下の記事で詳しく記載しています。

      https://marunaka-blog.com/material-design-xaml-toolkit_wpf_01/367/

      XAMLのソースは以下の記述になります。
      <Window
          x:Class="ZXingSample.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
          xmlns:local="clr-namespace:ZXingSample"
          xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
          Title="MainWindow"
          Width="400"
          Height="450"
          WindowStyle="None"
          mc:Ignorable="d">
          <Grid>
              <Grid.RowDefinitions>
                  <RowDefinition Height="50" />
                  <RowDefinition Height="50" />
                  <RowDefinition Height="*" />
              </Grid.RowDefinitions>
              <!--  ヘッダー  -->
              <materialDesign:ColorZone
                  Grid.Row="0"
                  Height="50"
                  Padding="12"
                  Mode="PrimaryMid">
                  <DockPanel>
                      <materialDesign:PopupBox DockPanel.Dock="Right" PlacementMode="BottomAndAlignRightEdges">
                          <ListBox>
                              <ListBoxItem Content="Close" />
                          </ListBox>
                      </materialDesign:PopupBox>
                      <StackPanel Orientation="Horizontal">
                          <materialDesign:PackIcon
                              Width="26"
                              Height="26"
                              Kind="Qrcode" />
                          <TextBlock
                              Margin="16,0,0,0"
                              VerticalAlignment="Center"
                              Text="QRcode SAMPLE" />
                      </StackPanel>
                  </DockPanel>
              </materialDesign:ColorZone>
              <Label
                  x:Name="lblQrcode"
                  Grid.Row="1"
                  Margin="15,20,0,0"
                  HorizontalAlignment="Left"
                  VerticalAlignment="Top"
                  Content="入力文字列:" />
              <TextBox
                  x:Name="txtQrcode"
                  Grid.Row="1"
                  Margin="100,8,115,0"
                  VerticalAlignment="Top"
                  materialDesign:HintAssist.Hint="文字列を入力してください。"
                  Style="{StaticResource MaterialDesignFloatingHintTextBox}" />
              <Button
                  Name="btnCreate"
                  Grid.Row="1"
                  Margin="0,0,10,0"
                  HorizontalAlignment="Right"
                  VerticalAlignment="Center"
                  Click="btnCreate_Click"
                  Content="QRコード生成"
                  FontSize="12" />
              <Image
                  x:Name="ImgQrcode"
                  Grid.Row="2"
                  Margin="10"
                  HorizontalAlignment="Stretch"
                  VerticalAlignment="Stretch" />
          </Grid>
      </Window>
      コードは以下の記述になります。
      namespace ZXingSample
      {
          public partial class MainWindow : Window
          {
              public MainWindow()
              {
                  InitializeComponent();
              }
      
              private void btnCreate_Click(object sender, RoutedEventArgs e)
              {
                  //QRコード画像をイメージコントロールへ反映
                  ImgQrcode.Source = QRcodeCreate(txtQrcode.Text);
              }
          }
      }

      アプリケーションを動かしてみると、ちゃんとQRコードが反映されました。

       

      よかったらシェアしてね!
      • URLをコピーしました!

      コメント

      コメントする

      記事の内容