【C#】QRコードの読み取り方法:カメラやライブラリを使って実装するしてみる

QRコードは今や私たちの生活に欠かせない存在です。
ウェブサイトへのリンク、商品情報の提供、デジタル決済など、幅広い用途で利用されています。

この記事では、C#を使ってQRコードを読み取る方法について解説します。
プログラミング初心者から上級者まで、手順に沿って進めることで自分のプロジェクトに
QRコード読み取り機能を簡単に組み込むことができます。

記事のポイント

  • QRコードの読み取りをC#で実装する方法を解説
  • カメラやライブラリを使ったQRコードの読み取り手順
  • 実際のコード例を示しながら、基本的な流れを理解
  • OpenCVやZXingライブラリを活用した具体的な方法
目次

C#でのQRコード読み取り:基本的なステップ

QRコードを読み取る方法には、カメラを使ったリアルタイムの読み取りや、静止画像の解析があります。
C#では、オープンソースのライブラリであるZXingを活用して、この機能を簡単に実装できます。

ZXingでQRコードを読み取る

ZXingライブラリは、C#でQRコードを読み取る際の主要なツールの一つです。
リアルタイムでカメラ映像からQRコードを検出するだけでなく、画像ファイルからも素早くデータを取得することができます。
特に、ZXingはオープンソースであるため、商用プロジェクトにも活用しやすいのが特徴です。

QRコードの読み取りはどうやってやる?

QRコードの読み取りには、まずカメラや画像ファイルから情報を取得し、それを解析する必要があります。
C#でQRコードを読み取る最も一般的な方法は、ZXing.Netライブラリを使うことです。
このライブラリは、さまざまな種類のバーコードやQRコードをサポートしており、非常に使いやすいAPIを提供しています。
プロジェクトタブの「NuGetパッケージの管理」からダウンロードできます。

以下は、ZXing.Netライブラリを使った簡単なサンプルコードです。
私の環境は「.NET Framework 4.7.2」で、動作確認済みです。

using ZXing;
using System.Drawing;

public string ReadQRCode(string imagePath)
{
    var barcodeReader = new BarcodeReader();
    var barcodeBitmap = (Bitmap)Bitmap.FromFile(imagePath);
    var result = barcodeReader.Decode(barcodeBitmap);
    return result?.Text;
}

このコードでは指定した画像ファイルからQRコードを解析し、その結果を返します。
カメラやWebカメラを使ったリアルタイムの読み取りも同様の手順で実装できます。

QRコードのURLを読み取る方法

QRコードには、URLが埋め込まれている場合が多いです。
C#を使ってこのURLを読み取るには、先ほどのZXingを使用した方法で取得したテキストがURLかどうかを確認すれば良いでしょう。
以下はそのサンプルコードです。

public void ReadQRCodeUrl(string imagePath)
{
    var qrText = ReadQRCode(imagePath);
    if (Uri.IsWellFormedUriString(qrText, UriKind.Absolute))
    {
        Console.WriteLine("Valid URL: " + qrText);
    }
    else
    {
        Console.WriteLine("Not a valid URL.");
    }
}

このコードは読み取ったテキストがURL形式かどうかをチェックし、URLであればそのまま利用できます。

【C#】ZXingでのQRコード読み取り

QRコード読み取り画面の出し方は?

QRコードの読み取り画面を作成する場合、Windows FormsやWPFを利用するのが一般的です。
フォーム上にカメラからの映像を表示し、QRコードが検出されると自動的に読み取りが開始されるように設計することができます。
以下は、カメラ映像を表示する基本的な手順です。
「AForge.Video」と「AForge.Video.DirectShow」はNuGetからインストールします。

// AForge.Videoライブラリを使用してカメラの映像を表示
using AForge.Video;
using AForge.Video.DirectShow;

public void StartCamera()
{
    var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
    var videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
    videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
    videoSource.Start();
}

private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
    // フォーム上に映像を表示
    var bitmap = (Bitmap)eventArgs.Frame.Clone();
    pictureBox.Image = bitmap;
}

このコードを使うことで、カメラの映像をリアルタイムで表示しながらQRコードを読み取ることができます。

上記、QRコードの読み取りとカメラを組み合わせたサンプルコードです。

using AForge.Video;
using AForge.Video.DirectShow;
using System;
using System.Drawing;
using System.Windows.Forms;
using ZXing;

namespace WindowsFormsApp_DotNetFramework
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // カメラ起動
            StartCamera();
        }

        // AForge.Videoライブラリを使用してカメラの映像を表示
        public void StartCamera()
        {
            var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            var videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
            videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
            videoSource.Start();
        }

        private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            // フォーム上に映像を表示
            var bitmap = (Bitmap)eventArgs.Frame.Clone();
            if (pictureBox.Image != null)
            {
                pictureBox.Image.Dispose();
            }
            pictureBox.Image = bitmap;
            string qrCode = ReadQRCode(bitmap.Clone());
            if (!string.IsNullOrEmpty(qrCode))
            {
                MessageBox.Show(qrCode);
            }
        }

        public string ReadQRCode(object bitmap)
        {
            if (pictureBox.Image == null)
            {
                return string.Empty;
            }
            var barcodeReader = new BarcodeReader();
            var barcodeBitmap = (Bitmap)bitmap;
            var result = barcodeReader.Decode(barcodeBitmap);
            return result?.Text;
        }
    }
}

PC画面でQRコードを読み取る方法は?

QRコードの読み取りは、カメラを使わずとも可能です。
例えば、スクリーンショットを取得してその画像からQRコードを解析する方法があります。
これには、ZXingを利用すると良いでしょう。


using System;
using System.Drawing;
using System.Windows.Forms;
using ZXing;

namespace WindowsFormsApp_DotNetFramework
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void button1_Click(object sender, EventArgs e)
        {
            CaptureScreenshot();
        }

        public void CaptureScreenshot()
        {
            // スクリーンのサイズを取得
            Rectangle bounds = Screen.PrimaryScreen.Bounds;

            // Bitmapオブジェクトを作成
            using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
            {
                // Graphicsオブジェクトを使用して画面をキャプチャ
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    g.CopyFromScreen(System.Drawing.Point.Empty, System.Drawing.Point.Empty, bounds.Size);
                }

                // ZXingでQRコードを解析
                var reader = new BarcodeReader();
                var result = reader.Decode(bitmap);

                // 結果を出力
                if (result != null)
                {
                    Console.WriteLine(result.Text);
                }
                else
                {
                    Console.WriteLine("QRコードが検出されませんでした。");
                }
            }
        }
    }
}

スクリーンショットを取得し、その画像からQRコードを読み取ることができます。

バーコードリーダーを制御する方法

バーコードリーダーを使ってQRコードやその他のバーコードを読み取る場合、そのデバイスを制御する方法も理解しておく必要があります。
通常、バーコードリーダーはキーボードの入力として動作しますが、C#から直接制御することも可能です。

以下は、C#でバーコードリーダーを使ってデータを取得する方法の例です。

// バーコードリーダーからのデータ取得
public void GetBarcodeData()
{
    // シリアルポート経由でバーコードリーダーと通信
    SerialPort serialPort = new SerialPort("COM3", 9600);
    serialPort.Open();
    string barcodeData = serialPort.ReadLine();
    Console.WriteLine("Barcode: " + barcodeData);
    serialPort.Close();
}

この方法では、シリアルポートを使用してバーコードリーダーからデータを取得します。

C#でのQRコード読み取りのまとめ

QRコードの読み取りはC#とオープンソースライブラリを使うことで非常に簡単に実装できます。
ZXingなどのツールを活用することで、リアルタイムのカメラ映像や静止画像から素早くQRコードを解析できます。
プロジェクトに応じて、最適なライブラリを選び、効率的にQRコード読み取り機能を組み込みましょう。

他にもC#の様々なテクニックの紹介やエンジニアに役立つ情報を発信していますので興味のある方は以下のリンクからどうぞ!

C#やエンジニアに役立つ情報はこちら

収入を上げたいエンジニアはこちら

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