上一篇文章中讲述了使用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());
***************************************************************************************************************
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/wangshubo1989/article/details/47168759