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());

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



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一苇渡江694

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值