上一篇文章中讲述了使用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());
***************************************************************************************************************
版权声明:本文为博主原创文章,未经博主允许不得转载。