c#vs2010怎么实现接口vs2010,打印多行商品条形码

C#基础(125)
开发人员不喜欢打字。如果你希望提高开发人员的生产力,减少键入的数量,这也同时减少打字稿的数量以及因此产生的编译器错误,这些都极大分散了开发人员的注意力。代码重用是开发人员收集代码的另一个原因。即使单个应用程序也会大量地由小而公共的代码段组成,在几乎每个程序中都会有相同的代码元素:循环、类、异常处理等等。开发人员传统上是对代码进行剪切和粘贴以避免重复键入。但是这具有相当的局限性,包括有限的持久性,应该有更可行的解决方案。
这个解决方案就是在Visual Studio 2005中引入的代码段技术。代码段是可重用的源代码的容器。一个代码段是代码的一个别名。插入一个代码段就是在光标处或选中的地方将它所代表的代码插入到源文件中。代码段提高了开发人员的效率和准确性。
2.初识代码段
(1).什么是代码段?
将一段代码行提取出来,可以多次重复的使用。VS IDE提供对代码段的完整支持、使代码编写更快、更容易、更可靠。
一个代码段的例子
(2).系统默认代码段
对于开发人员的例行任务,Visual Studio 2005有默认代码段。默认代码段是代码扩展和外侧代码的混合。默认代码段出现在IntelliSense完成列表和代码选择器中。表1列出了一些默认代码段。
表1&默认代码段
该代码段用#if和#endif命令围绕代码
该代码段用#region和#endregion命令围绕代码
该代码段插入一个析构函数
该代码段插入一个定制属性的声明,该定制属性是从System.Attribute派生的一个类
该代码段用一个checked块围绕代码
该代码段插入一个类声明
该代码段插入一个构造函数
该代码段插入一个Console.WriteLine语句
该代码段用一个do while块围绕代码
该代码段插入一个else块
该代码段插入一个enum声明
该代码段重写从System.Object类型继承的Equals方法
该代码段插入一个应用程序异常的声明,该异常派生自System.Exception
该代码段用一个for循环围绕代码
该代码段用一个foreach循环围绕代码
该代码段用一个decrementing for循环围绕代码
该代码段用一个if块围绕代码
该代码段插入一个索引器函数
该代码段插入一个接口声明
该代码段插入一个迭代器
interindex
该代码段插入一个命名的迭代器和索引器
该代码段插入并调用一个事件
该代码段用一个lock块围绕代码
该代码段插入MessageBox.Show语句
该代码段用一个namespace围绕代码
该代码段插入一个属性和后备字段
该代码段插入一个只读属性。只读属性只有一个get方法
该代码段插入一个返回一个整数的静态入口方法
该代码段插入一个struct声明
该代码段插入一个返回为void的静态入口方法
该代码段插入一个switch语句
该代码段插入一个try-catch块
该代码段插入一个try-finally块
该代码段用一个unchecked块围绕代码
该代码段插入一个unsafe块
该代码段用一个using块围绕代码
该代码段用一个while循环围绕代码
(3).代码段管理器
用代码段管理器来管理代码段,包括添加、移除、导入和搜索代码段。
代码段管理器可以在“工具”菜单里打开(见图4.33)。在代码段管理器里显示的文件夹是代码段目录,打开一个文件夹来查看一个代码段。对于每个代码段提供了以下信息:
& “代码段管理器”对话框
l&&&代码段描述
l&&&代码段的别名或快捷方式
l&&&代码段类型
l&&&代码段的作者
对话框里的“添加”按钮向代码段目录列表添加另一个目录。一个代码段目录包含代码段文件,这是带有.snippet后缀的XML文件。对于C#,默认的代码段目录是My Code Snippets,Refactoring和Visual C#。“移除”按钮从列表中移除一个代码段目录。“导入”按钮导入一个代码段文件。用“联机搜索”按钮来浏览代码段,这个按钮打开一个通用搜索窗口,开发人员可以通过它搜索代码段。找到正在搜索的代码段后,就可以将其下载到本地机器。
下载网上所找到的代码段可能会引起安全问题,代码段无法保证所有的XML都是无害的。此外,代码段也可能隐藏有恶意脚本,在代码段中定义的“帮助URL”元素可能会暗地里运行一个脚本。还有,代码段可能会不加任何提示地添加引用,在引用中可能会对函数进行恶意调用。长代码段可能会隐含有害代码。在下载涉及数据库和代码访问安全、基于角色的安全或验证代码的时候要小心。较好的办法是在应用程序使用代码段之前,先仔细检查下载的代码段的源代码。
3.解密代码段
(1).如何定义代码段
&CodeSnippets
xmlns=&/VisualStudio/2005/CodeSnippet&&
&CodeSnippet&Format=&1.0.0&&
My Snippet
&Code Language=&CSharp&&
&![CDATA[MessageBox.Show(&Hello World&);]]&
&/Snippet&
&/CodeSnippet&
&/CodeSnippets&
对于这段XML的解释
o Header&包含以下子元素:
– Author :&指定代码段的作者姓名。
– Description :&指定有关IntelliSense&代码段内容的描述信息。
– HelpUrl :&指定提供有关代码段的更多信息的URL。
– Keywords :&为代码段指定自定义关键字。
– Shortcut :&指定用于插入代码段的快捷方式文本。
– SnippetTypes :&指定Visual Studio&插入代码段的方式。
– Title :&指定代码段的标题。
o Snippet&包含以下子元素:
– Code :&提供用于容纳IntelliSense&代码段的短代码块的容器。
– Declarations :&指定构成代码段可编辑部分的文本和对象。
– Imports :&指定IntelliSense&代码段使用的导入命名空间。
– References :&指定有关代码段所需的程序集引用的信息。
o SnippetTypes :&指定Visual Studio&插入代码段的方式。
– SurroundsWith:允许将此代码段放置在一段选定的代码周围。
– Expansion:允许将代码段插入到光标处。
&SnippetTypes&
&SnippetType&Expansion&/SnippetType&
&SnippetType&SurroundsWith&/SnippetType&
&/SnippetTypes&
o Code :&提供用于容纳IntelliSense&代码段的短代码块的容器。
属性如下:
– Language:代码语言(必选)
– Kind :&指定代码段所包含的代码类型,并据此指定可以插入代码段
的位置。可用的值有method body、method decl、type decl、
page、file&和any
o Declarations :&指定构成代码段可编辑部分的文本和对象。
包含以下子元素:
– Literal:定义代码段的可编辑文本。
– Object:定义代码段的可编辑对象。
&Declarations&
&ID&SQL&/ID&
&ToolTip&Replace with a SQL connection string.&/ToolTip&
&Default&&SQL connection string&&/Default&
&/Literal&
&ID&Connection&/ID&
&Type&System.Data.SqlClient.SqlConnection&/Type&
&ToolTip&Replace with a connection object in your application.&/ToolTip&
&Default&dcConnection&/Default&
&/Declarations&
&/Snippet&
4.使用代码段
o&如何使用代码段?
–&通过键盘快捷键
o Ctrl+K、Ctrl+X
o Ctrl+K、Ctrl+S (外侧代码段)
–&通过IntelliSense&自动完成使用代码段
o&键入快捷方式,键入两次Tab&以调用代码段
–&通过“编辑”菜单使用代码段
o&从“编辑”菜单中选择“IntelliSense”,然后选择“插入代码段”命
–&通过上下文菜单使用代码段
o&右击光标,然后从上下文菜单中选择“插入代码段”命令
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:38921次
排名:千里之外
原创:24篇
转载:114篇
(1)(1)(2)(2)(4)(1)(1)(2)(2)(1)(3)(3)(4)(3)(13)(38)(1)(1)(10)(9)(5)(8)(23)本帖子已过去太久远了,不再提供回复功能。17164人阅读
C#常用功能(2)
C#利用Zxing.net生成条形码和二维码并实现打印的功能
&&& 开篇:zxing.net是.net平台下编解条形码和二维码的工具。
&&&&&&&& 下载地址:
Step1:使用VS2010新建一个窗体程序项目:
Step2:添加三个类:分别是BarCodeClass.cs、DocementBase.cs、imageDocument.cs。(下一步贴出这些类的代码);;;;添加下载回来的引用zxing.dll。
《1》&& BarCodeClass.cs主要用来实现条形码和二维码的生成和解析。
《2》&& DocementBase.cs、imageDocument.cs这两个类是用来实现对生成的条形码和二维码进行打印。
Step3:编写上一步的三个类的代码:
》BarCodeClass.cs
&&& using S
using System.Collections.G
using System.L
using System.T
using System.Windows.F
using System.D
using System.Text.RegularE
using ZXing.QrC
namespace BarCode
BarCodeClass
&&&&&&& ///&summary&
&& &&&&&///生成条形码
&&&&&&& ///&/summary&
&&&&&&& ///&paramname=&pictureBox1&&&/param&
&&&&&&& ///&paramname=&Contents&&&/param&
&&&&&&& public
void CreateBarCode(PictureBoxpictureBox1,string Contents)
&&&&&&&&&&& Regexrg =
new Regex(&^[0-9]{12}$&);
& &&&&&&&&&&if(!rg.IsMatch(Contents))
&&&&&&&&&&&& {
&&&&&&&&&&&&&&&& MessageBox.Show(&本例子采用EAN_13编码,需要输入12位数字&);
&&&&&&&&&&&&&&&& return;
&&&&&&&&&&&& }
&&&&&&&&&&& EncodingOptionsoptions =null;
&&&&&&&&&&& BarcodeWriterwriter =null;
&&&&&&&&&&& options = newEncodingOptions
&&&&&&&&&&& {
&&&&&&&&&&&&&&& Width = pictureBox1.Width,
&&&&&&&&&&&&&&& Height = pictureBox1.Height
&&&&&&&&&&& };
&&&&&&&&&&& writer = newBarcodeWriter();
&&&&&&&&&&& writer.Format = BarcodeFormat.ITF;
&&&&&&&&&&& writer.Options =
&&&&&&&&&&& Bitmapbitmap = writer.Write(Contents);
&&&&&&&&&&& pictureBox1.Image =&
&&&&&&& ///&summary&
&&&&&&& ///生成二维码
&&&&&&& ///&/summary&
&&&&&&& ///&paramname=&pictureBox1&&&/param&
&&&&&&& ///&paramname=&Contents&&&/param&
&&&&&&& public
void CreateQuickMark(PictureBoxpictureBox1,string Contents)
&&&&&&&&&&& if(Contents ==
string.Empty)
&&&&&& &&&&&{
&&&&&&&&&&&&&&& MessageBox.Show(&输入内容不能为空!&);
&&&&&&&&&&&&&&& return;
&&&&&&&&&&& }
&&&&&&&&&&& EncodingOptionsoptions =null;
&&&&&&&&&&& BarcodeWriterwriter =null;
&&&&&&&&&&& options = newQrCodeEncodingOptions
&&&&&&&&&& {
&&&&&&&&&&&&&& DisableECI = true,
&&&&&&&&&&&&&& CharacterSet = &UTF-8&,
&&&&&&&&&&&&&& Width = pictureBox1.Width,
&&&&&&&&&&&&&& Height = pictureBox1.Height
&&&&&&&&&& };
&&&&&&&&&&& writer = newBarcodeWriter();
&&&&&&&&&&& writer.Format = BarcodeFormat.QR_CODE;
&&&&&&& &&&&writer.Options =
&&&&&&&&&&& Bitmapbitmap = writer.Write(Contents);
&&&&&&&&&&& pictureBox1.Image =
&&&&&&& ///&summary&
&&&&&&& ///解码
&&&&&&& ///&/summary&
&&&&&&& ///&paramname=&pictureBox1&&&/param&
&&&&&&& public
void Decode(PictureBoxpictureBox1)
&&&&&&&&&&& BarcodeReaderreader =new
BarcodeReader();
&&&&&&&&&&& Resultresult = reader.Decode((Bitmap)pictureBox1.Image);
》DocementBase.cs
&&& using S
using System.Collections.G
using System.L
using System.T
using System.Drawing.P
using System.D
using System.Windows.F
namespace BarCode
DocementBase : PrintDocument
&&&&&&& //fields
&&&&&&& public
Font Font = new
Font(&Verdana&,10,
GraphicsUnit.Point);
&&&&&&& //预览打印
&&&&&&& public
DialogResult showPrintPreviewDialog()
&&&&&&&&&&& PrintPreviewDialogdialog =new
PrintPreviewDialog();
&&& &&&&&&&&dialog.Document = this;
&&&&&&&&&&& returndialog.ShowDialog();
&&&&&&& //先设置后打印
&&&&&&& public
DialogResult ShowPageSettingsDialog()
&&&&&&&&&&& PageSetupDialogdialog =new
PageSetupDialog();
&&&&&&&&&&& dialog.Document = this;
&&&&&&&&&&& returndialog.ShowDialog();
》imageDocument.cs
&&& using S
using System.Collections.G
using System.L
using System.T
using System.D
using System.Drawing.P
namespace BarCode
imageDocument : DocementBase
&&&&&&& privateImage _I
&&&&&&& public
Image Image
&&&&&&&&&&& get
&&&&&&&&&&& {
&&&&&&&&&&&&&&& return_I
&&&&&&&&&&& }
&&&&&&&&&&& set
&&&&&&&&&&& {
&&&&&&&&&&&&&&& _Image = value;
&&&&&&&&&&&&&&& if(_Image !=
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& if(_Image.Size.Width & _Image.Size.Height)
&&&&&&&&&&&&&&&&&&&&&&&DefaultPageSettings.Landscape =
&&&&&&&&&&&&&&&&&&& else
&&&&&&&&&&&&&&&&&&&&&&&DefaultPageSettings.Landscape =
&&&&& &&&&&&&&&&}
&&&&&&&&&&& }
&&&&&&& publicimageDocument()
&&&&&&& publicimageDocument(Image image)
&&&&&&&&&&& this.Image=
&&&&&&& protectedoverridevoidOnPrintPage(PrintPageEventArgs e)
&&&&&&&&&&& if(Image ==
&&&&&&&&&&& {
&&&&&&&&&&&&&&& thrownewInvalidOperationException();
&&&&&&&&&&& }
&&&&&&&&&&& RectanglebestFit = GetBestFitRectangle(e.MarginBounds, Image.Size);
&&&&&&&&&&& e.Graphics.DrawImage(Image, bestFit);
&&&&&&&&&&& e.Graphics.DrawRectangle(Pens.Black, bestFit);
&&&&&&&&&&& e.Graphics.DrawRectangle(Pens.Black, e.MarginBounds);
&&&&&& // 保持高度比:参数为(打印边界的Rectangularle对象,图像大小的Size对象)
&&&&&&& protectedRectangle GetBestFitRectangle(Rectangle toContain,SizeobjectSize)
&&&&&&&&&&& //检查页面是水平还是竖直的。
&&&&&&&&&&& boolcontainerLandscape =false;
&&&&&&&&&&& if(toContain.Width & toContain.Height)
&&&&&&&&&&&&&&& containerLandscape = true;
&&&&&&&&&&& //高度比=图像的高/图像的宽
&&&&&&&&&&& floataspectRatio = (float)objectSize.Height / (float)objectSize.W
&&&&&&&&&&& //得到页面左上角的坐标
&&&&&&&&&&& intmidContainerX = toContain.Left + (toContain.Width / 2);
&&&&&&&&&&& intmidContainerY = toContain.Top + (toContain.Height / 2);
&&&&&&&&&&& intx1 = 0, x2 = 0, y1 = 0, y2 = 0;
&&&&&&&&&&& if(containerLandscape ==false)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& //竖直图像
&&&&&&&&&&&&&&& x1 = toContain.L
&&&&&&&&&&&&&&& x2 = toContain.R
&&&&&&&&&&&&&&& //调整之后的height
&&&&&&&&&&&&&&& intadjustedHeight = (int)((float)toContain.Width * aspectRatio);
&&&&&&&&&&&&&&& y1 = midContainerY -(adjustedHeight / 2);
&&&&&&&&&&&&&&& y2 = y1 + adjustedH
&&&&&&&&&&& }
&&&&&&&&&&& else
&&&&&&&&&&& {
&&&&&&&&&&&&&&& y1 = toContain.T
&&&&&&&&&&&&&&& y2 = toContain.B
&&&&&&&&&&&&&&& //调整之后的height
&&&&&&&&&&&&&&& intadjustedWidth = (int)((float)toContain.Height/ aspectRatio);
&&&&&&&&&&&&&&& x1 = midContainerX -(adjustedWidth / 2);
&&&&&&&&&&&&&&& x2 = x1 + adjustedW
&&&&&&&&&&& }
&&&&&&&&&&& returnnewRectangle(x1,y1, x2 - x1, y2 - y1);
Step4:修改界面。
Step5:依次双击【生成条形码】、【生成二维码】、【解码】、【打印】等按钮,进入Click事件,编写后台代码。这里不再一一讲述如何实现。代码参照下一步:
Step6:贴出窗体的全部代码。
using System.Collections.G
using ponentM
using System.D
using System.D
using System.L
using System.T
using System.Windows.F
using System.Text.RegularE
using ZXing.QrCode.I
using System.IO;
using ZXing.QrC
namespace BarCode
&&& public
partial class
Main : Form
&&&&&&& publicMain()
&&&&&&&&&&& InitializeComponent();&
&&&&&& private
BarCodeClass bcc = newBarCodeClass();
&&&&&& private
DocementBase _
&&&&&&& //生成条形码
&&&&&&& privatevoid button1_Click(objectsender,EventArgs e)
&&&&&&&&&&& bcc.CreateBarCode(pictureBox1,txtMsg.Text);
&&&&&&&&&&
&&&&&&& //生成二维码
&&&&&&& privatevoid button2_Click(objectsender,EventArgs e)
&&&&&&&&&&& bcc.CreateQuickMark(pictureBox1, txtMsg.Text);
&&&&&&& privatevoid Form1_Load(objectsender,EventArgs e)
&&&&&&&&&&& txtMsg.Text = System.DateTime.Now.ToString(&yyyyMMddhhmmss&).Substring(0,12);
&&&&&&& //解码
&&&&&&& privatevoid button4_Click(objectsender,EventArgs e)
&&&&&&&&&&& if(pictureBox1.Image ==null)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& MessageBox.Show(&请录入图像后再进行解码!&);
&&&&&&&&&&&&&&& return;
&&&&&&&&&&& }
&&&&&&&&&&& BarcodeReaderreader =new
BarcodeReader();&
&&&&&&&&&&& Resultresult = reader.Decode((Bitmap)pictureBox1.Image);
&&&&&&&&&&& MessageBox.Show(result.Text);
&&&&&&& //打印
&&&&&&& privatevoid button3_Click(objectsender,EventArgs e)
&&&&&&&&&&
&&&&&&&&&&& if(pictureBox1.Image ==null)
&&&&&&&&&&& {
&&&&&& &&&&&&&&&MessageBox.Show(&You Must Load an Image first!&);
&&&&&&&&&&&&&&& return;
&&&&&&&&&&& }
&&&&&&&&&&& else
&&&&&&&&&&& {
&&&&&&&&&&&&&&& _docement=new
imageDocument(pictureBox1.Image);
&&&&&&&&&&& }
&&&&&&&&& _docement.showPrintPreviewDialog();
Step7:剩下的就是演示了:本机演示结果如下:
》运行程序:点击【生成条形码】,结果如下:
》点击【解码】按钮,结果如下:
》点击《打印》按钮,结果如下:
》点击【生成二维码】按钮,结果如下:
》点击【解码】按钮,结果如下:
》点击【打印】按钮,结果如下:
总结:若有不足,请各位提出批评。
(分享快乐!!!)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:48361次
排名:千里之外
评论:19条
(1)(1)(2)(1)(1)(1)(1)14345人阅读
WinForm(21)
转自:/tuyile006/archive//2863367.html
本篇介绍可以在C#中使用的1D/2D编码解码器。条形码的应用已经非常普遍,几乎所有超市里面的商品上面都印有条形码;二维码也开始应用到很多场合,如火车票有二维码识别、网易的首页有二维码图标,用户只需要用手机扫描一下就可以看到手机版网易的网址,免去了输入长串字符的麻烦。
条形码的标准:
条形码的标准有ENA条形码、UPC条形码、二五条形码、交叉二五条形码、库德巴条形码、三九条形码和128条形码等,而商品上最常使用的就是EAN商品条形码。EAN商品条形码亦称通用商品条形码,由国际物品编码协会制定,通用于世界各地,是目前国际上使用最广泛的一种商品条形码。我国目前在国内推行使用的也是这种商品条形码。EAN商品条形码分为EAN-13(标准版)和EAN-8(缩短版)两种。
二维码的编码标准:
全球现有的二维码多达200种以上,其中常见的技术标准有PDF417(美系标准),QRCode(日系标准),Code49,Code16K,CodeOne,DM(韩系标准),GM(中国标准),CM(中国标准)等20余种。用得最多的是QRcode。
下面借助google的开源项目zxing来实现1D/2D的编码和解码,测试效果如下:
zxing的官方地址是:/p/zxing/
zxing的功能还是很强大的,最初是用java编写,并支持Android、ios、symbian等手机操作系统。
不过不知是何原因,该官网连一个例子也没有,文档也是字典式的把所有类列出来,一点都没为读者考虑。
下面我把如果使用zxing完成上图所示例子讲解一遍,供初学者参考:
1.我们新建一个Winform测试项目;
2.从官网下载zxing开源项目,大概16m的样子,解压缩后打开zxing-2.1\csharp目录,将该目录拷贝到我们新建的Winform项目下(方便调试和看源码,并非一定要如此);
3.winform项目中添加对zxing项目的引用;
4.按上图所示例子建好控件,“生成条形码”的代码如下:
&&&&&&&&privatevoid
button1_Click(objectsender, EventArgs e)
&&&&&&&&&&&&lbshow.Text =&&;
&&&&&&&&&&&&Regex rg =new
Regex(&^[0-9]{13}$&);
&&&&&&&&&&&&if(!rg.IsMatch(txtMsg.Text))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&MessageBox.Show(&本例子采用EAN_13编码,需要输入13位数字&);
&&&&&&&&&&&&&&&&return;
&&&&&&&&&&&&}
&&&&&&&&&&&&
&&&&&&&&&&&&try
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&MultiFormatWriter mutiWriter =new
com.google.zxing.MultiFormatWriter();
&&&&&&&&&&&&&&&&ByteMatrix bm = mutiWriter.encode(txtMsg.Text, com.google.zxing.BarcodeFormat.EAN_13, 363, 150);
&&&&&&&&&&&&&&&&Bitmap img= bm.ToBitmap();
&&&&&&&&&&&&&&&&pictureBox1.Image =
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&stringfilename = System.Environment.CurrentDirectory +
&\\EAN_13& + DateTime.Now.Ticks.ToString() +&.jpg&;
&&&&&&&&&&&&&&&&img.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);
&&&&&&&&&&&&&&&&lbshow.Text =&图片已保存到:&
&&&&&&&&&&&&}
&&&&&&&&&&&&catch(Exception ee)
&&&&&&&&&&&&{ MessageBox.Show(ee.Message); }
 其中需要注意BarcodeFormat参数,可以打开定义看到具体的编码方式,自己百度每种编码方式对输入的要求。
这里EAN_13编码要求是13位长度的数字,并且满足:把所有偶数序号位上的数相加求和,用求出的和乘3,再把所有奇数序号上的数相加求和,用求出的和加上刚才偶数序号上的数,然后得出和能被10整除。(这个规则校验在UPCEANReader类的checkStandardUPCEANChecksum方法里面,如果不需要,可以去掉)
生成二维码的代码与上面相似:
//生成二维码
private void button2_Click(object sender, EventArgs e)
lbshow.Text = &&;
MultiFormatWriter mutiWriter = new com.google.zxing.MultiFormatWriter();
ByteMatrix bm = mutiWriter.encode(txtMsg.Text, com.google.zxing.BarcodeFormat.QR_CODE, <span style="color:#0, <span style="color:#0);
Bitmap img = bm.ToBitmap();
pictureBox1.Image =
//自动保存图片到当前目录
string filename = System.Environment.CurrentDirectory &#43; &\\QR& &#43; DateTime.Now.Ticks.ToString() &#43; &.jpg&;
img.Save(filename, System.Drawing.Imaging.ImageFormat.Jpeg);
lbshow.Text = &图片已保存到:& &#43;
catch (Exception ee)
{ MessageBox.Show(ee.Message); }
注意编码问题,在com.google.zxing.qrcode.encoder.Encoder类中修改默认编码为utf-8,否则解码出现的是乱码。
System.String DEFAULT_BYTE_MODE_ENCODING = &UTF-8&; &
此处之前是&ISO-8859-1&,之所以改成UTF-8是因为,在解码的时候程序会猜测可能的编码,如果猜测失败则默认是UTF-8,代码在com.google.zxing.qrcode.decoder.DecodedBitStreamParser类的guessEncoding方法中。
所以此开源项目也缺少全局性思考,连编码和解码的默认编码方式都不一致。
经网友反映,还是有些中文会出现解码成乱码,而有些又可以,估计还是guessEncoding方法猜测编码出现了偏差,直接将guessEncoding方法写成返回UTF8就行了。
4.实现图片解码,即把条形码或二维码图片解码成其真实内容,当然在pc上应用不大,但可能只是还没发现而已,代码如下:
//解码操作
private void button3_Click(object sender, EventArgs e)
MultiFormatReader mutiReader = new com.google.zxing.MultiFormatReader();
Bitmap img = (Bitmap)Bitmap.FromFile(opFilePath);
if (img == null)
LuminanceSource ls = new RGBLuminanceSource(img, img.Width, img.Height);
BinaryBitmap bb = new BinaryBitmap(new com.mon.HybridBinarizer(ls));
Result r= mutiReader.decode(bb);
txtMsg.Text = r.T
opFilePath是图片路径,你可以用openFileDialog控件打开文件来得到路径。
--------------------------------------------------------------------------------------
上面的Demo只是生成后的exe,没有源码。
自己模仿作者代码稍微改了一点写了一个玩,主要代码如下,所有源码下载:
private void btnDeTwo_Click(object sender, EventArgs e)
using (OpenFileDialog openFileDialog = new OpenFileDialog())
openFileDialog.Title = &选择二维码图片&;
openFileDialog.Filter = &Images (*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;&;
openFileDialog.AddExtension =
openFileDialog.RestoreDirectory =
if (openFileDialog.ShowDialog() == DialogResult.OK)
MultiFormatReader mutiReader = new MultiFormatReader();
Bitmap img = (Bitmap)Bitmap.FromFile(openFileDialog.FileName);
if (img == null)
pictureBox1.Image =
LuminanceSource ls = new RGBLuminanceSource(img, img.Width, img.Height);
BinaryBitmap bb = new BinaryBitmap(new HybridBinarizer(ls));
Result r = mutiReader.decode(bb);
txtMsg.Text = r.T
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:448816次
积分:5628
积分:5628
排名:第3383名
原创:169篇
转载:26篇
评论:66条
(1)(1)(1)(1)(1)(1)(1)(2)(3)(3)(3)(1)(7)(3)(4)(1)(2)(9)(10)(11)(15)(1)(1)(2)(1)(6)(2)(3)(2)(1)(1)(1)(6)(7)(13)(1)(4)(2)(10)(14)(14)(13)(3)(10)(1)(1)

我要回帖

更多关于 vs2010打印 的文章

 

随机推荐