QRコードをC# WindowsFormsアプリケーションで生成するのはどうすればいいのでしょうか? QRCodeEncoderLibraryというライブラリを使用すれば簡単にできてしまいます。NuGetからQRCodeEncoderLibraryをインストールしましょう。それから本当にそのQRコードは正しいものなのかも検証したいです。そこでQRコードを元に戻すためのQRCodeDecoderLibraryもインストールしてしまいましょう。
QRCodeEncoderLibraryライブラリでQRコードを生成する
ではさっそく以下のようなコードを書いてみましょう。Yahoo!JapanのトップページのurlをQRコードに変換しています。またQRコードからもとの”https://www.yahoo.co.jp/”に戻すことができるかどうかも検証しています。実行するとメッセージボックスが表示され、表示されるメッセージは”https://www.yahoo.co.jp/”であることが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { string url = "https://www.yahoo.co.jp/"; QRCodeEncoderLibrary.QREncoder Encoder = new QREncoder(); Encoder.ErrorCorrection = QRCodeEncoderLibrary.ErrorCorrection.Q; Encoder.ModuleSize = 4; Encoder.QuietZone = Encoder.ModuleSize * 4; Encoder.Encode(url); // QRコードをPictureBoxに表示する pictureBox1.Image = Encoder.CreateQRCodeBitmap(); // PictureBoxに表示されているImageを元のurlに戻せるかチェックする QRCodeDecoderLibrary.QRDecoder Decoder = new QRDecoder(); byte[][] DataByteArray = Decoder.ImageDecoder((Bitmap)pictureBox1.Image); string str = QRCodeDecoderLibrary.QRDecoder.ByteArrayToStr(DataByteArray[0]); MessageBox.Show(str); } } |
もう少し汎用性のあるものに作りかえる
そこで次にテキストボックスに入力されたurlをPNGファイルとして保存するプログラムへと拡張してみることにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { string url = textBox1.Text; if (url == "") return; string filePath = ""; SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "PNGファイル(*.png)|*.png"; if (dialog.ShowDialog() == DialogResult.OK) filePath = dialog.FileName; dialog.Dispose(); if (filePath == "") return; QRCodeEncoderLibrary.QREncoder Encoder = new QREncoder(); Encoder.ErrorCorrection = QRCodeEncoderLibrary.ErrorCorrection.Q; Encoder.ModuleSize = 6; Encoder.QuietZone = Encoder.ModuleSize * 4; Encoder.Encode(url); Encoder.SaveQRCodeToPngFile(filePath); // 保存されたファイルを開いてPictureBoxに表示させる // ただしファイルがロックしないようにコピーを表示させ、ファイルから取得したBitmapはすぐにDisposeする Bitmap bitmap = new Bitmap(filePath); pictureBox1.Image = new Bitmap(bitmap); bitmap.Dispose(); // 正当性のチェック QRCodeDecoderLibrary.QRDecoder Decoder = new QRDecoder(); byte[][] DataByteArray = Decoder.ImageDecoder((Bitmap)pictureBox1.Image); textBox2.Text = QRCodeDecoderLibrary.QRDecoder.ByteArrayToStr(DataByteArray[0]); } } |
一度に大量に処理をできるようにする
Excelファイルに書かれているUrlのリストを一気にQRコードに変換できるようにします。
まずダイアログでExcelファイルを選択し、このなかにあるurlというシートのA列に書かれているurlのQRコードを生成してB列に書き込みます。またQRコードは一定の高さがあるのでQRコードが書き込まれたらその行の高さを変更します。
ボタンがクリックされたらユーザーにExcelファイルを選択させ、自作メソッド SetQRCodeToExcelでA列に書かれているurlのQRコードをB列に書き込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { string filePath = ""; SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "Excelファイル(*.xlsx)|*.xlsx"; if (dialog.ShowDialog() == DialogResult.OK) filePath = dialog.FileName; dialog.Dispose(); if (filePath == "") return; SetQRCodeToExcel(filePath, 2); } } |
SetQRCodeToExcelメソッドは以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
public partial class Form1 : Form { void SetQRCodeToExcel(string filePath, int moduleSize = 2) { string tempPath = Application.StartupPath + "\\temp.png"; if (File.Exists(tempPath)) File.Delete(tempPath); using (var workbook = new XLWorkbook(filePath)) { IXLWorksheet worksheet = workbook.Worksheet("url"); int lastRow = worksheet.LastCellUsed().Address.RowNumber; for (int i = 1; i <= lastRow; i++) { string url = worksheet.Cell(i, "A").GetString(); Bitmap bitmap = GetQRCode(url, moduleSize); if (bitmap != null && CheckQRCode(bitmap, url)) { bitmap.Save(tempPath, System.Drawing.Imaging.ImageFormat.Png); bitmap.Dispose(); IXLPicture image = worksheet.AddPicture(tempPath); image.MoveTo(worksheet.Cell(i, "B")); if (File.Exists(tempPath)) File.Delete(tempPath); worksheet.Row(i).Height = 50; } } workbook.Save(); } System.Diagnostics.Process.Start(filePath); } } |
GetQRCodeはurlからBitmapを取得するメソッドです。またCheckQRCodeメソッドはQRコードから本当に元のurlを取得できるかどうかを確認するためのものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public partial class Form1 : Form { Bitmap GetQRCode(string url, int moduleSize = 4) { QRCodeEncoderLibrary.QREncoder Encoder = new QREncoder(); Encoder.ErrorCorrection = QRCodeEncoderLibrary.ErrorCorrection.Q; Encoder.ModuleSize = moduleSize; Encoder.QuietZone = Encoder.ModuleSize * 4; Encoder.Encode(url); return Encoder.CreateQRCodeBitmap(); } bool CheckQRCode(Bitmap qr, string url) { QRCodeDecoderLibrary.QRDecoder Decoder = new QRDecoder(); byte[][] DataByteArray = Decoder.ImageDecoder(qr); string str = QRCodeDecoderLibrary.QRDecoder.ByteArrayToStr(DataByteArray[0]); return str == url ? true : false; } } |