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; } } |
鳩でも分かるC#管理人からのお願い
できる仕事であれば請け負います。鳩でもわかるC#管理人はクラウドワークスに在宅ワーカーとして登録しています。お仕事の依頼もお待ちしております。
⇒ 仕事を依頼する
コメントについて
コメントで英語などの外国語でコメントをされる方がいますが、管理人は日本語以外はわからないので基本的に内容が理解できず、承認することもありません。それからへんな薬を売っているサイトやリンク先のサイトが存在しないというスパムコメントも多々あります。
Some people make comments in foreign languages such as English, but since the manager does not understand anything other than Japanese, he basically cannot understand the content and does not approve it. Please use Japanese when making comments.
そんななか日本語のコメントもいただけるようになりました。「○○という変数はどこで宣言されているのか?」「××というメソッドはどこにあるのか」「例外が発生する」「いっそのことソース丸ごとくれ」という質問ですが、管理人としては嬉しく思います。「自分が書いた記事は読まれているんだな」と。疑問点には可能な限り答えます。記事に問題があれば修正いたします。
そのうえでお願いがあります。「匿名」という味も素っ気もない名前ではなく、捨てハンでいいのでなにかハンドルネームをつくってほしいと思います。
管理人のモチベーションアップのために
よろしければご支援お願いします。
⇒ 管理人の物乞いリスト