セージ の メモ書き

メモこそ命の恩人だ

C# - QRコード

ZXing (Zebra Crossing)

https://github.com/zxing/zxing

  • zebra crossing:横断歩道
  • 読み方:ゼブラクロッシング
  • Java 用のバーコード読込ライブラリ

ZXing.NET

https://marunaka-blog.com/c-sharp-zxing-qrcode/2092/

  • ZXing の .NET 用ライブラリ。
  • "C# QRコード" で検索すると多く見つかるライブラリ(2022/2 時点)
  • ライブラリ情報(2022/2 時点)
    • ダウンロード数:6.89M件
    • バージョン:0.16.8
    • 作成者:Michael Jahn
    • ライセンス:Apache-2.0
  • 参照の追加が必要
    • System.Drawing

QRコードの作成

こんな感じ。

public System.Drawing.Bitmap CreateQrcodeBitmap(string content)
{
    var barcodeWriter = new ZXing.BarcodeWriter
    {
        Format = ZXing.BarcodeFormat.QR_CODE,   // 形式:QRコード
        Options = new ZXing.QrCode.QrCodeEncodingOptions
        {
            ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.M, // QRコードの信頼性
            CharacterSet = "Shift_JIS",    // 文字コード(既定値:ISO-8859-1)
            Height = 200,   // QRコードの高さ
            Width = 200,    // QRコードの幅
            Margin = 3,     // QRコード周囲の余白の大きさ
        }
    };
    return barcodeWriter.Write(content);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
    // QRコード作成
    var bitmap = CreateQrcodeBitmap("https://www.google.com/");
    
    // WPF の Image に表示(※ Bitmap → BitmapSource 変換が必要)
    Image1.Source = Convert(bitmap);
}

// Bitmap → BitmapSource 変換
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
public BitmapSource Convert(System.Drawing.Bitmap bitmap)
{
    var handle = bitmap.GetHbitmap();
    try
    {
        return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
            handle,
            IntPtr.Zero,
            Int32Rect.Empty,
            BitmapSizeOptions.FromEmptyOptions());
    }
    finally
    {
        DeleteObject(handle);
    }
}

QRコードの読込

こんな感じ。

public string LoadQrcodeBitmap(System.Drawing.Bitmap bitmap)
{
    var barcodeReader = new ZXing.BarcodeReader();
    var result = barcodeReader.Decode(bitmap);
    if (result == null) return string.Empty;
    var barcodeFormat = result.BarcodeFormat.ToString();
    return result.Text;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
    var filePath = System.IO.Path.Combine(Environment.CurrentDirectory, "QR.bmp");
    var bitmap = System.Drawing.Image.FromFile(filePath) as System.Drawing.Bitmap;
    var content = LoadQrcodeBitmap(bitmap);
    Debug.WriteLine(content);
}



以上