因为使用到ZXing.Net库,所以需要下载添加引用到项目去。
ZXing是一个开源Java类库用于解析多种格式的1D、2D条形码,能够对QR编码、Data Matrix、UPC的1D条形码进行解码它提供了多种平台的客户端:J2SE、J2ME、Android、Net。
- ZXing.Net开源代码地址:https://github.com/micjahn/ZXing.Net
- 通过NuGet将Zxing.Net添加到你的项目下,如下图。
安装完成后项目会多了以下几个引用
Xaml代码:
首先xaml代码添加Image控件显示生成的二维码,以及Button控件显示下载和生成二维码按钮。
后台(C#):
首先引入需要用到的命名空间。
生成二维码事件,将Image控件数据源设置空,调用二维码生成方法,设置Button的可见性。
编写生成二维码方法,
因为生成的是Bitmap,在WPF需要转换为BitmapImage(xaml上载图像的专用BitmapSource)
将生成的二维码保存到本地。
全部代码:
namespace WpfApp3
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
//生成二维码按钮
private void Button_Click(object sender, RoutedEventArgs e)
{ imageQRCode.Source = null;
try
{
GeneratorQRCode(txtbox_input.Text);
btn_dow.Visibility = Visibility.Visible;
}
catch (Exception ex)
{
txtbox_input.Text = ex.Message;//异常
}
}
// 二维码生成函数
private Image GeneratorQRCode(string txt)
{
//BarcodeWriter一个智能类来编码一些内容的二维码、条形码图像
BarcodeWriter writer = new BarcodeWriter
{
Format = BarcodeFormat.QR_CODE//设置二维码的格式
};
writer.Options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8"); // 编码格式
writer.Options.Hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H);
int codeSizeInPixels = 260; // 二维码长宽
writer.Options.Height = codeSizeInPixels;
writer.Options.Width = codeSizeInPixels;
writer.Options.Margin = 0; // 设置边框
BitMatrix bm = writer.Encode(txt);
Bitmap img = writer.Write(bm);//对指定内容进行编码,并返回该码的呈现实例(渲染属性、实例使用,在方法之前调用)
imageQRCode.Source = BitmapToBitmapImage(img);//将图片控件的数据源设为生成后的二维码
return img;
}
// Bitmap --> BitmapImage
public static BitmapImage BitmapToBitmapImage(Bitmap bitmap)
{
using (MemoryStream stream = new MemoryStream())
{
bitmap.Save(stream, ImageFormat.Png);
stream.Position = 0; BitmapImage result = new BitmapImage();
result.BeginInit(); result.CacheOption = BitmapCacheOption.OnLoad; result.StreamSource = stream; result.EndInit();
result.Freeze();
return result;
}
}
/// <summary>
/// 保存二维码图片
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click_1(object sender, RoutedEventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Image Files ( *.png, *.bmp, *.jpg)|*.bmp;*.png;*.jpg | All Files | *.*";//图片格式
sfd.RestoreDirectory = true;//保存对话框是否记忆上次打开的目录
if (sfd.ShowDialog() == true)
{
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create((BitmapSource)this.imageQRCode.Source));
using (FileStream stream = new FileStream(sfd.FileName, FileMode.Create))
encoder.Save(stream);
}
}
}
}
效果:
根据内容生成二维码
点击下载将二维码保存到本地