C#使用QRCoder和ZXing实现二维码的生成和识别
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using QRCoder;
using Windows.Devices.PointOfService;
using ZXing;
using ZXing.Common;
using ZXing.QrCode;
using ZXing.QrCode.Internal;
namespace WinFormsApp4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string name = "1234";
QRCodeGenerator QR = new QRCodeGenerator();
QRCodeData cd = QR.CreateQrCode(name, QRCodeGenerator.ECCLevel.Q);
QRCoder.QRCode qRCode = new QRCoder.QRCode(cd);
Bitmap qrCodeImage = qRCode.GetGraphic(5, Color.Black, Color.White, null, 15, 6, false);
qrCodeImage.Save(Environment.CurrentDirectory + "\\t.jpeg");
}
private void button2_Click(object sender, EventArgs e)
{
button2.Text = DecodeQrCode(Environment.CurrentDirectory + "\\t.jpeg");
}
string DecodeQrCode(string filename)
{
//直接new Bitmap会导致图片占用,无法再次覆盖生成
Bitmap bitmap = FileToBitmap(filename);
try
{
BarcodeReader reader = new BarcodeReader { AutoRotate = true };
Result result = reader.Decode(bitmap);
string decodedData = result.Text;
return decodedData;
}
catch
{
throw new Exception("Cannot decode the QR code");
}
return null;
}
/// <summary>
/// 读取Bitmap图片,防止资源占用导致在此读取失败
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
Bitmap FileToBitmap(string fileName)
{
// 打开文件
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
// 读取文件的 byte[]
byte[] bytes = new byte[fileStream.Length];
fileStream.Read(bytes, 0, bytes.Length);
fileStream.Close();
// 把 byte[] 转换成 Stream
Stream stream = new MemoryStream(bytes);
stream.Read(bytes, 0, bytes.Length);
// 设置当前流的位置为流的开始
stream.Seek(0, SeekOrigin.Begin);
MemoryStream mstream = null;
try
{
mstream = new MemoryStream(bytes);
return new Bitmap((Image)new Bitmap(stream));
}
catch (ArgumentNullException ex)
{
return null;
}
catch (ArgumentException ex)
{
return null;
}
finally
{
stream.Close();
}
}
}
}