C#でQRコードを生成・読み取りする方法|無料ライブラリとサンプルコード付き
はじめに
C#でQRコードを扱うときは、まず「生成だけでよいのか」「読み取りまで必要なのか」「Windows限定か、LinuxやDockerでも動かしたいか」を整理すると、選ぶべきライブラリが見えやすくなります。QRCoder は生成特化で、読み取りはできません。一方、ZXing.Net は生成と読み取りの両方に対応し、SkiaSharp.QrCode は SkiaSharp ベースでクロスプラットフォーム性と高性能を重視しています。
1. C#でQRコードを生成・読み取りする前に知っておきたいこと
1-1. この記事でできるようになること
この記事では、C#でQRコードを生成する基本、画像ファイルから読み取る方法、よく使うオプション設定、実装時に起きやすいエラーの対処までまとめて確認できます。特に、QRCoder と ZXing.Net の使い分け、そして .NET 6 以降での画像処理の注意点を押さえておくと、実装で迷いにくくなります。
1-2. C#でQRコードを扱う主な用途
QRコードは、WebサイトのURLを印刷物や画面から開かせたいとき、アプリのログイン補助、Wi-Fi 接続情報の配布、メール送信の導線、店舗やイベントでの案内など、幅広い場面で使われます。C#では、ASP.NET Core の画面表示、Windows Forms や WPF の業務アプリ、バックエンドでの画像生成、カメラ画像の読み取り処理などに組み込むことが多いです。
1-3. QRコード生成と読み取りで必要になるライブラリ
生成だけなら QRCoder か SkiaSharp.QrCode が扱いやすく、読み取りまで含めるなら ZXing.Net が有力です。QRCoder は「QRコードを作る」ことに集中していて、Base64、PNG、SVG など複数の出力形式を持っています。ZXing.Net は QR Code だけでなく、PDF417、EAN、UPC、Aztec、Data Matrix などのバーコードも扱えるため、読み取り機能まで必要な場面に向いています。
1-4. .NET Framework/.NET Core/.NET 6以降での注意点
.NET 6 以降では、System.Drawing.Common は Windows 専用として扱われ、非 Windows 環境ではコンパイル時警告や実行時例外が発生します。Microsoft もクロスプラットフォーム用途では SkiaSharp、ImageSharp、Microsoft.Maui.Graphics などへの移行を案内しています。したがって、Linux や Docker でも動かす前提なら、System.Drawing に強く依存する設計は避けたほうが安全です。
2. C#で使える無料QRコードライブラリの比較
2-1. QRCoder:QRコード生成に特化した定番ライブラリ
QRCoder は .NET 向けの純粋な C# 実装で、QRコードの生成に特化しています。Wiki では、読み取りはできず、生成用途に強いこと、また Base64QRCode、PngByteQRCode、SvgQRCode などのレンダラーが用意されていることが示されています。小さく導入しやすく、Web・業務アプリ・印刷用途に向いています。
2-2. ZXing.Net:QRコードの生成・読み取りに対応
ZXing.Net は、もともとの ZXing を C# に移植したライブラリで、生成と読み取りの両方に対応します。公式リポジトリでは、QR Code を含む複数のバーコード形式を画像内で扱えると説明されており、Apache-2.0 ライセンスです。読み取りも必要なら、最初の候補になりやすいライブラリです。
2-3. SkiaSharp.QrCode:クロスプラットフォーム対応を重視する場合
SkiaSharp.QrCode は、SkiaSharp を使った QRコード生成ライブラリで、Windows、Linux、macOS、iOS、Android、WebAssembly などのクロスプラットフォーム対応を前面に出しています。System.Drawing を使わないため、.NET 6 以降の非 Windows 環境でも扱いやすく、NativeAOT 対応も特徴です。ライセンスは MIT です。
2-4. 各ライブラリの対応機能・ライセンス・選び方
生成だけで十分なら QRCoder、生成と読み取りの両方を一つで済ませたいなら ZXing.Net、Windows 以外も含めて画像処理を安定させたいなら SkiaSharp.QrCode が選びやすいです。QRCoder は生成特化、ZXing.Net は多機能、SkiaSharp.QrCode はクロスプラットフォームと描画のしやすさが強みです。
2-5. 初心者におすすめのライブラリはどれか
初心者が「まず QRコードを出したい」だけなら QRCoder が最も取り組みやすいです。読み取りまで必要なら ZXing.Net に進むのが自然です。Linux や Docker にも展開したい、あるいは System.Drawing の制約を避けたいなら SkiaSharp.QrCode を選ぶと、後から環境差で悩みにくくなります。
3. C#でQRコードを生成する方法
3-1. NuGetでQRCoderをインストールする
QRCoder は NuGet から追加できます。生成専用で使うなら、まずこのライブラリを入れておくと実装がシンプルです。
3-2. 文字列からQRコード画像を生成するサンプルコード
QRCoder では、まず QRCodeGenerator でデータを作り、PngByteQRCode などのレンダラーで画像化します。System.Drawing に頼らず PNG バイト列として出力できるため、非 Windows 環境でも扱いやすい構成にしやすいです。
C#using QRCoder;
string text = "C#でQRコードを生成するサンプルです。";
using var qrGenerator = new QRCodeGenerator();
using var qrCodeData = qrGenerator.CreateQrCode(text, QRCodeGenerator.ECCLevel.Q);
var pngQrCode = new PngByteQRCode(qrCodeData);
byte[] pngBytes = pngQrCode.GetGraphic(20);
File.WriteAllBytes("qrcode.png", pngBytes);
3-3. URLをQRコード化するサンプルコード
URL をそのまま文字列として渡せば、リンク先を開くためのQRコードを作れます。Webサイトの案内、資料ダウンロード、製品ページへの誘導などでよく使う形です。
C#using QRCoder;
string url = "https://example.com";
using var qrGenerator = new QRCodeGenerator();
using var qrCodeData = qrGenerator.CreateQrCode(url, QRCodeGenerator.ECCLevel.M);
var pngQrCode = new PngByteQRCode(qrCodeData);
byte[] pngBytes = pngQrCode.GetGraphic(10);
File.WriteAllBytes("url-qrcode.png", pngBytes);
3-4. PNG画像として保存する方法
PNG で保存するなら、生成した byte[] をそのままファイルに書き出す方法がいちばん簡単です。QRCoder の PNG 出力は System.Drawing を使わないため、Web アプリやサーバー側処理にも組み込みやすいです。
3-5. Base64形式で出力する方法
画面に直接表示したいときは、Base64 文字列にして <img> タグへ埋め込む方法が便利です。QRCoder には Base64QRCode が用意されており、Web ページにそのまま差し込む用途に向いています。
C#using QRCoder;
string text = "https://example.com";
using var qrGenerator = new QRCodeGenerator();
using var qrCodeData = qrGenerator.CreateQrCode(text, QRCodeGenerator.ECCLevel.Q);
var base64QrCode = new Base64QRCode(qrCodeData);
string base64 = base64QrCode.GetGraphic(20);
string imgTag = $"<img src=\"data:image/png;base64,{base64}\" alt=\"QR code\" />";
3-6. ASP.NET CoreでQRコードを画面に表示する方法
ASP.NET Core では、生成した PNG バイト列を File() で返すと、ブラウザ上に画像として表示できます。HTML を返すページと画像生成を分ける構成にすると、後からメンテナンスしやすくなります。
C#using Microsoft.AspNetCore.Mvc;
using QRCoder;
[ApiController]
[Route("qr")]
public class QrController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
using var qrGenerator = new QRCodeGenerator();
using var qrCodeData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.Q);
var pngQrCode = new PngByteQRCode(qrCodeData);
byte[] pngBytes = pngQrCode.GetGraphic(10);
return File(pngBytes, "image/png");
}
}
4. ZXing.NetでQRコードを生成する方法
4-1. NuGetでZXing.Netをインストールする
ZXing.Net は NuGet から導入できます。生成だけでなく読み取りも必要なら、まず候補に入れたいライブラリです。
4-2. BarcodeWriterを使ったQRコード生成コード
ZXing.Net では、BarcodeWriter 系を使って QRコードを生成できます。Windows 向けのアプリでは System.Drawing と組み合わせやすく、読み取りと同じライブラリで揃えられるのが利点です。
C#using System.Drawing;
using System.Drawing.Imaging;
using ZXing;
using ZXing.QrCode;
using ZXing.Windows.Compatibility;
var writer = new BarcodeWriter
{
Format = BarcodeFormat.QR_CODE,
Options = new QrCodeEncodingOptions
{
Width = 300,
Height = 300,
Margin = 1,
CharacterSet = "UTF-8"
}
};
using var bitmap = writer.Write("https://example.com");
bitmap.Save("zxing-qrcode.png", ImageFormat.Png);
4-3. 幅・高さ・余白・文字コードを指定する方法
生成時は、幅と高さ、余白、文字コードを揃えておくと、読み取りやすいQRコードを作りやすくなります。特に日本語を含む文字列では、文字コードを明示しておくと、想定外の文字化けを避けやすくなります。
4-4. 日本語を含むQRコードを生成する際の注意点
日本語を含める場合は、UTF-8 を明示するのが基本です。読み取り側のアプリや端末によっては、エンコード解釈の差が出ることがあるため、実機での確認もあわせて行うと安心です。
4-5. Windows FormsやWPFでQRコードを表示する方法
Windows Forms や WPF では、生成した Bitmap をそのまま PictureBox や ImageSource に渡せるので、画面表示が簡単です。ZXing.Net は Windows 向けのサンプルも多く、既存のデスクトップアプリに組み込みやすいのが強みです。
5. C#でQRコードを読み取る方法
5-1. ZXing.Netで画像ファイルからQRコードを読み取る
読み取りは ZXing.Net の得意分野です。公式 README でも、画像内のバーコードをデコードできることが示されており、QR Code を含む複数形式に対応しています。
5-2. PNG・JPG画像を読み込むサンプルコード
Windows 環境で System.Drawing を使えるなら、画像ファイルを読み込んで Decode する基本形はシンプルです。Windows 以外では System.Drawing.Common の制約があるため、別の画像ライブラリ向けバインディングを使う設計に切り替えます。
C#using System.Drawing;
using ZXing;
using ZXing.Windows.Compatibility;
IBarcodeReader reader = new BarcodeReader();
using var bitmap = (Bitmap)Image.FromFile("sample-qrcode.png");
var result = reader.Decode(bitmap);
if (result != null)
{
Console.WriteLine(result.Text);
}
5-3. 複数のQRコードを読み取る方法
1枚の画像に複数のQRコードが写っていると、1回の読み取りで取り切れないことがあります。その場合は、画像を分割して順に読むか、複数バーコード探索の考え方を使うと安定しやすくなります。
5-4. カメラ画像やアップロード画像から読み取る場合の考え方
カメラ画像では、ピント、ブレ、反射、縮小率の影響を受けやすくなります。アップロード画像なら、解像度を十分に確保し、回転補正やトリミングを挟んでから読み取ると成功率が上がります。ZXing.Net は画像内の読み取りを想定しているので、前処理の有無が結果に大きく効きます。
5-5. 読み取り結果がnullになる原因と対処法
null になるときは、画像が小さすぎる、余白が足りない、ぼやけている、文字列が長すぎて密度が高い、または読み取り対象が想定外の向きになっていることが多いです。まずは高解像度で再生成し、余白を少し増やし、読み取り側では対象フォーマットを QR Code に絞ると改善しやすくなります。
6. QRコード生成時によく使うオプション設定
6-1. 誤り訂正レベルの選び方
誤り訂正レベルは、多少の欠損や汚れにどれだけ強くするかを決める要素です。ロゴを載せる、印刷品質が揺れる、ステッカーとして貼るといった用途では、やや高めの設定が向いています。QRCoder は誤り訂正レベルを指定して生成できます。
6-2. QRコードのサイズを変更する方法
サイズは、読み取りやすさと表示領域のバランスで決めます。小さすぎると密度が高くなり、読み取り失敗の原因になります。画面表示なら 200〜300px 程度から始め、印刷なら実寸で確認するのが無難です。
6-3. 余白を調整する方法
余白が少なすぎると、周囲の文字や画像と干渉して読み取り率が落ちます。QRコードは周囲の静かな余白が重要なので、生成時の margin は削りすぎないほうが安全です。ZXing.Net でも QRCoder でも、余白の調整は読み取り品質に直結します。
6-4. 色や背景色を変更する方法
見た目を変えることはできますが、コントラストは十分に保つ必要があります。背景色が濃すぎる、文字色が薄すぎる、あるいは画像の上に重ねると、読み取り率が下がりやすくなります。
6-5. ロゴ付きQRコードを作る際の注意点
ロゴを中央に載せるデザインは見栄えがよい一方で、読み取りに必要な情報を隠しすぎると失敗します。ロゴを入れる場合は、誤り訂正レベルを上げ、ロゴサイズを小さめに抑え、必ず複数の端末で検証してください。SkiaSharp.QrCode はアイコンや形状のカスタマイズを前面に出しており、QRCoder もアート系レンダリングに対応しています。
6-6. URL・メール・Wi-Fi設定用QRコードの作り方
URL はそのまま文字列として、メールは送信用の文字列として、Wi-Fi は接続情報を含むペイロードとして組み立てます。QRCoder は Wi-Fi などの特殊な payload を扱える設計で、一般的なリンク以外の用途にも向いています。
7. 実装でよくあるエラーと解決方法
7-1. System.Drawing.Common関連のエラー
.NET 6 以降で System.Drawing.Common を使うと、Windows 以外では警告や例外が出ます。QRコード生成で Bitmap を返す実装をそのまま移植すると詰まりやすいため、PNG バイト列や SkiaSharp ベースの実装に切り替えるのが安全です。
7-2. BarcodeWriterやBarcodeReaderが使えない場合
ZXing.Net では、.NET Standard や .NET 5 以降で使うとき、画像処理用の追加バインディングが必要になることがあります。公式 README でも、特定のイメージライブラリ向けパッケージを追加する案内があり、単純に本体だけ入れても完結しないケースがある点に注意が必要です。
7-3. .NET 6以降で画像処理がうまく動かない場合
Windows でしか動かない前提のコードを、そのまま Linux や Docker に持っていくと失敗しやすいです。クロスプラットフォームで安定させるなら、QRCoder の byte[] 出力や SkiaSharp.QrCode のような System.Drawing 非依存の構成に寄せると解決しやすくなります。
7-4. QRコードが読み取れない・文字化けする場合
読み取り失敗や文字化けは、サイズ不足、余白不足、低コントラスト、画像の圧縮劣化、文字コードの不一致で起きやすいです。まずは UTF-8 を明示し、サイズと margin を増やし、読み取り画像を高解像度にするのが基本です。ZXing.Net でも読み取りの失敗例は実際に報告されており、画質と密度の調整は重要です。
7-5. NuGetパッケージのバージョン違いによるエラー
ZXing.Net はバージョン 0.16.11 が 2025 年時点の最新として公開されており、QRCoder も 6 系以降の .NET 向けに更新されています。古いサンプルをそのまま貼ると、名前空間やバインディングの差で動かないことがあるため、使っている NuGet の README と対象フレームワークを確認してから実装すると安全です。
8. 用途別のおすすめ実装パターン
8-1. とにかく簡単にQRコードを生成したい場合
生成だけなら QRCoder が最も手早いです。QRCodeGenerator でデータを作り、PngByteQRCode で PNG にする流れがわかりやすく、Web でもデスクトップでも流用しやすいです。
8-2. 生成と読み取りの両方を実装したい場合
生成と読み取りを一つのライブラリでまとめるなら ZXing.Net が適しています。バーコード全般を扱えるため、後から QR 以外の読み取り要件が出ても拡張しやすいです。
8-3. WebアプリでQRコードを表示したい場合
ASP.NET Core なら、画像を byte[] で生成してそのままレスポンスに返す構成が相性抜群です。QRCoder は Base64 出力もできるので、HTML に直接埋め込む実装にも向いています。
8-4. デスクトップアプリでQRコードを扱いたい場合
Windows Forms や WPF では、ZXing.Net と System.Drawing の組み合わせが古くから使われています。既存の業務アプリに読み取り機能を追加する場面では、導入コストを抑えやすいのが利点です。
8-5. LinuxやDocker環境で動かしたい場合
Linux や Docker では、System.Drawing.Common を前提にした実装を避けるのが重要です。QRCoder の PNG バイト列出力や、SkiaSharp.QrCode のような SkiaSharp ベースの実装を選ぶと、環境差を吸収しやすくなります。
9. C#のQRコード実装に関するよくある質問
9-1. C#でQRコードを無料で生成できますか?
できます。QRCoder や ZXing.Net、SkiaSharp.QrCode のようなオープンソースライブラリを使えば、追加費用をかけずにQRコードを生成できます。
9-2. QRコードの読み取りにも無料ライブラリは使えますか?
使えます。読み取りまで必要なら、ZXing.Net が代表的です。画像ファイル、カメラ画像、アプリで取り込んだ画像に対してデコード処理を組み込めます。
9-3. QRCoderとZXing.Netはどちらを使うべきですか?
生成だけなら QRCoder、読み取りも必要なら ZXing.Net が基本です。Web で軽くQRコードを出したいなら QRCoder、アプリ全体でバーコード処理を統一したいなら ZXing.Net が向いています。
9-4. 日本語を含むQRコードは作成できますか?
作成できます。文字コードを UTF-8 にそろえ、生成側と読み取り側の両方で同じ前提を持たせると安定しやすくなります。
9-5. 商用利用できるQRコードライブラリはありますか?
あります。ZXing.Net は Apache-2.0、SkiaSharp.QrCode は MIT で公開されています。QRCoder もオープンソースとして提供されており、商用案件でも候補に入れやすいライブラリです。実際の利用時は、導入先のポリシーに合わせて各リポジトリのライセンス表記を確認してください。
まとめ
C#でQRコードを扱うなら、生成専用の QRCoder、生成と読み取りの両方に強い ZXing.Net、クロスプラットフォーム志向の SkiaSharp.QrCode という分け方で考えると選びやすくなります。とくに .NET 6 以降では System.Drawing.Common の制約が大きいため、Windows 前提か、非 Windows も含めるかを最初に決めることが実装成功の近道です。

