WPF 操作二维码(二)

上一篇文章中讲述了使用C#生成二维码的操作,接下来进一步添加功能。

1. 将生成的二维码保存成本地图片

该操作的关键是如何读取Image控件中资源,并保存到本地。

1.1 创建一个BitmapSource的对象,表示具有特定大小和分辨率的单个不变的像素集。

1.2 创建一个BitmapEncoder的对象,将BitmapFram对象的集合编码为图像流。

1.3 使用BitmapFrame.Create方法,从给定的BitmapSource创建新的BitmapSource

1.4 FileStream类,公开以文件为主的Stream,既支持同步读写操作,也支持异步读写操作。public FileStream(string path, FileMode mode)。

1.5 通过BitmapEncoder.Frames.Add()设置图像内的各帧。

1.6 通过BitmapEncoder.Save方法,将位图图像编码为指定的Stream

BitmapSource m = (BitmapSource)image1.Source;

BitmapEncoder encoder = null;

encoder = new PngBitmapEncoder();

FileStream stream = new FileStream("5555.png", FileMode.Create);

encoder.Frames.Add(BitmapFrame.Create(m));

encoder.Save(stream);

2. Image控件中显示选择的本地二维码图片

2.1 定义个OpenFileDialog的对象,表示一个通用对话框,用户可以使用此对话框来指定一个或多个要打开的文件的文件名。

2.2 通过OpenFileDialog.Title属性设置文件对话框的标题栏中显示的文本;

通过OpenFileDialog.Multiselect属性设置是否允许用户选择多个文件;

通过OpenFileDialog.Filter属性设置筛选器字符串;

通过OpenFileDialog.FileName属性设置一个字符串,其中包含在文件对话框中选定的文件的完整路径。

2.3 声明一个BitmapImage类的对象,提供一个经优化以使用XAML上载图像的专用BitmapSource。

2.4 最后将WPF上的Image控件的Source进行复制。

Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();

dlg.Title = "Please select image!";//设置标题

dlg.Multiselect = false;//禁止多选

dlg.InitialDirectory = InitialPath;//设定默认路径

dlg.Filter = "图片|*.jpg;*.png;*.gif;*.bmp;*.jpeg";

dlg.ShowDialog();

string szPath =dlg.FileName;

BitmapImage bitmapImage = new BitmapImage();

bitmapImage.BeginInit();

bitmapImage.CacheOption = BitmapCacheOption.OnLoad;

bitmapImage.UriSource = new Uri(szPath);

bitmapImage.EndInit();

bitmapImage.Freeze();

image1.Source = bitmapImage;

3. 识别Image控件中显示的二维码图片

关键点在于把WPF Image控件中的图像转换为bitmap

3.1 声明一个BarcodeReader对象,一个智能类来解码一个位图对象里面的条形码或二维码;

使用BarcodeReader.Decode(Bitmap )方法对一个位图对象的条形码或是二维码进行解密;

BarcodeReader.Decode(Bitmap )的返回值为Result类型,参数为Bitmap类型。

3.2 创建一个BitmapSource的对象m,获得Image控件中的Source,赋值为m;

创建一个Bitmap的对象bmp,调用public Bitmap(int width, int height, PixelFormat format)构造函数创建一个指定大小和格式化Bitmap类的新实例。

调用Bitmap.LockBits方法,将Bitmap锁定到系统内存中。

调用BitmapSource.CopyPixels方法,复制位图像素数据。

调用Bitmap.UnlockBits方法,从系统内存解锁此Biamap。

3.3 调用Result.ToString()方法,用于显示读取二维码中的字符串。

BarcodeReader reader =new BarcodeReader();

BitmapSource m = (BitmapSource)image1.Source;

System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(m.PixelWidth, m.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);

System.Drawing.Imaging.BitmapData data = bmp.LockBits(new System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);

m.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);

bmp.UnlockBits(data);

Result result = reader.Decode(bmp);

MessageBox.Show(result.ToString());

***************************************************************************************************************

WPF 操作二维码(二)_第1张图片


你可能感兴趣的:(C#,二维码,WPF)