zoukankan      html  css  js  c++  java
  • C# 生成二维码,彩色二维码,带有Logo的二维码及普通条形码

       每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默。我眼中的程序员大多都不爱说话,默默承受着编程的巨大压力,除了技术上的交流外,他们不愿意也不擅长和别人交流,更不乐意任何人走进他们的内心!

       废话少说,咱直接进入正题:

       目前来说,比较流行的二维码生成方式有两种:一种是:QrCode.Net和谷歌的Zxing.Net,我个人比较倾向于使用ZXing.Net,今天本篇博客主要讲解Zxing.Net的使用。

       本篇我会把QrCode.Net的代码和Zxing.Net的代码贴下来。其中QrCode.Net的官方网址为:http://qrcodenet.codeplex.com/  Zxing的官方网址为:http://zxingnet.codeplex.com/ 可通过官网,把dll文件下载下来,然后作为项目引用。当然,老外(外语)写的东东,看不懂也没什么,做到会用就行啦!

       首先粘贴下关于QrCode.Net的代码(此代码没做验证,有兴趣的小虎斑可以自行测试),如下:

       1、项目需要引用:Gma.QrCodeNet.Encoding.Net45 在官网上下载,我是VS12开发的,所以版本是4.5

       代码如下:

    #region  QrCode.Net
            //生成二维码
            static void Generate1(string url)
            {
                //创建二维码生成类
                QrEncoder qrEncoder = new QrEncoder();
                QrCode qrCode = qrEncoder.Encode(url);
                //输出显示在控制台
                for (int j = 0; j < qrCode.Matrix.Height; j++)
                {
                    for (int i = 0; i < qrCode.Matrix.Width; i++)
                    {
                        char charToPoint = qrCode.Matrix[i, j] ? '' : ' ';
                        Console.Write(charToPoint);
                    }
                    Console.WriteLine();
                }
            }
            //生成图片
            static void Generate2(string url)
            {
                QrEncoder qrEncoder = new QrEncoder();
                QrCode qrCode = qrEncoder.Encode(url);
                //保存成png文件
                string filename = @"H:桌面截图url.png";
                GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(5, QuietZoneModules.Two), Brushes.Black, Brushes.White);
                using (FileStream stream = new FileStream(filename, FileMode.Create))
                {
                    render.WriteToStream(qrCode.Matrix, ImageFormat.Png, stream);
                }
            }
    
            //生成中文二维码-支持中文
            static void Generate3()
            {
                QrEncoder qrEncoder = new QrEncoder();
                QrCode qrCode = qrEncoder.Encode("我是小天马");
                //保存成png文件
                string filename = @"H:桌面截图cn.png";
                GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(5, QuietZoneModules.Two), Brushes.Black, Brushes.White);
    
                Bitmap map = new Bitmap(500, 500);
                Graphics g = Graphics.FromImage(map);
                g.FillRectangle(Brushes.Red, 0, 0, 500, 500);
                render.Draw(g, qrCode.Matrix, new Point(20, 20));
                map.Save(filename, ImageFormat.Png);
            }
    
            //设置二维码大小
            static void Generate4()
            {
                QrEncoder qrEncoder = new QrEncoder();
                QrCode qrCode = qrEncoder.Encode("我是小天马");
                //保存成png文件
                string filename = @"H:桌面截图size.png";
                //ModuleSize 设置图片大小  
                //QuietZoneModules 设置周边padding
                /*
                    * 5----150*150    padding:5
                    * 10----300*300   padding:10
                    */
                GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(10, QuietZoneModules.Two), Brushes.Black, Brushes.White);
    
                Point padding = new Point(10, 10);
                DrawingSize dSize = render.SizeCalculator.GetSize(qrCode.Matrix.Width);
                Bitmap map = new Bitmap(dSize.CodeWidth + padding.X, dSize.CodeWidth + padding.Y);
                Graphics g = Graphics.FromImage(map);
                render.Draw(g, qrCode.Matrix, padding);
                map.Save(filename, ImageFormat.Png);
            }
    
            //生成带Logo的二维码
            static void Generate5()
            {
                QrEncoder qrEncoder = new QrEncoder();
                QrCode qrCode = qrEncoder.Encode("我是小天马");
                //保存成png文件
                string filename = @"H:桌面截图logo.png";
                GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(5, QuietZoneModules.Two), Brushes.Black, Brushes.White);
    
                DrawingSize dSize = render.SizeCalculator.GetSize(qrCode.Matrix.Width);
                Bitmap map = new Bitmap(dSize.CodeWidth, dSize.CodeWidth);
                Graphics g = Graphics.FromImage(map);
                render.Draw(g, qrCode.Matrix);
                //追加Logo图片 ,注意控制Logo图片大小和二维码大小的比例
                Image img = Image.FromFile(@"F:JavaScript_SolutionQrCodeQrCodeImages101.jpg");
    
                Point imgPoint = new Point((map.Width - img.Width) / 2, (map.Height - img.Height) / 2);
                g.DrawImage(img, imgPoint.X, imgPoint.Y, img.Width, img.Height);
                map.Save(filename, ImageFormat.Png);
            }
            #endregion

       以上代码本人并未测试,有兴趣的小虎斑可以自行测试哈!

       下面说说Zxing.Net的使用,在说这个之前,本人先将做出来的东东粘贴给大家看

       生成的二维码如下:

       普通二维码:

       

       带有logo的二维码:

       

       其中Logo为:

       彩色二维码(大家可根据需要,自行定制):

       好了,牛也吹了,不能不上代码啊,那下面咱们来观摩下代码(别忘了引用Zxing.dll,没有的话,去官网下载哈):

      

     class Program
        {
            static void Main(string[] args)
            {
                //生成带有logo的二维码
                string Pth = Environment.CurrentDirectory;
                string  LogoPth =Pth + "//logo.jpg";
                string serverPth = Pth + "//" + DateTime.Now.ToString("yyyy-MM-dd") + ".Jpeg";
                Generate("http://www.baidu.com", LogoPth, serverPth, ImageFormat.Jpeg);
                //基础版本
                Bitmap BT = GenByZXingNet_Color("Yolanda");
                string baseEWM = Pth + "//base_ErWeiMa.png";
                BT.Save(baseEWM, System.Drawing.Imaging.ImageFormat.Png);
                //条形码
                string TXMpth = Pth + "//TXM.png";
                Generate("Yolanda", TXMpth, ImageFormat.Png);
                //读取二维码条形码
                string K = Read(TXMpth);
                string H = Read(serverPth);
                Console.WriteLine(K+"   "+H);
                Console.Read();
                
            }
    
            #region C#生成二维码-基础版本
            //需要引用ZXing.DLL  可以百度一下  一个很好用的二维码生成程序集《DLL文件啦》
            //使用案例:Bitmap img3 = GenByZXingNet("");
            //使用案例:img3.Save(Server.MapPath(@"	estImgerweima.png"));
            /// <summary>
            /// 生成二维码
            /// </summary>
            /// <param name="msg">二维码信息</param>
            /// <param name="codeSizeInPixels">正方形 边长</param>
            /// <returns>图片</returns>
            public static Bitmap GenByZXingNet(string msg,int codeSizeInPixels = 250)
            {
                BarcodeWriter writer = new BarcodeWriter();
                writer.Format = BarcodeFormat.QR_CODE;
                writer.Options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");//编码问题
                writer.Options.Hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H);
    
                writer.Options.Height = writer.Options.Width = codeSizeInPixels;
                writer.Options.Margin = 0;//设置边框1            ZXing.Common.BitMatrix bm = writer.Encode(msg);
                Bitmap img = writer.Write(msg);
                return img;
            }
    
            #endregion
    
            #region C#生成带有Log的二维码
            /// <summary>
            /// 生成带Logo的二维码
            /// </summary>
            /// <param name="text">文本内容</param>
            static void Generate(string text, string LogoPth, string serverPth, ImageFormat imgFrt)
            {
                //Logo 图片
                Bitmap logo = new Bitmap(LogoPth);
                //构造二维码写码器
                MultiFormatWriter writer = new MultiFormatWriter();
                Dictionary<EncodeHintType, object> hint = new Dictionary<EncodeHintType, object>();
                hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
                hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
    
                //生成二维码 
                BitMatrix bm = writer.encode(text, BarcodeFormat.QR_CODE, 300, 300, hint);
                BarcodeWriter barcodeWriter = new BarcodeWriter();
                Bitmap map = barcodeWriter.Write(bm);
    
    
                //获取二维码实际尺寸(去掉二维码两边空白后的实际尺寸)
                int[] rectangle = bm.getEnclosingRectangle();
    
                //计算插入图片的大小和位置
                int middleW = Math.Min((int)(rectangle[2] / 3.5), logo.Width);
                int middleH = Math.Min((int)(rectangle[3] / 3.5), logo.Height);
                int middleL = (map.Width - middleW) / 2;
                int middleT = (map.Height - middleH) / 2;
    
                //将img转换成bmp格式,否则后面无法创建Graphics对象
                Bitmap bmpimg = new Bitmap(map.Width, map.Height, PixelFormat.Format32bppArgb);
                using (Graphics g = Graphics.FromImage(bmpimg))
                {
                    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                    g.DrawImage(map, 0, 0);
                }
                //将二维码插入图片
                Graphics myGraphic = Graphics.FromImage(bmpimg);
                //白底
                myGraphic.FillRectangle(Brushes.White, middleL, middleT, middleW, middleH);
                myGraphic.DrawImage(logo, middleL, middleT, middleW, middleH);
    
                //保存成图片
                bmpimg.Save(serverPth, imgFrt);
            }
            #endregion
    
            #region ZXing生成条形码
            /// <summary>
            /// 文本内容
            /// </summary>
            /// <param name="text">只支持数字 只支持偶数个 最大长度80</param>
            /// <param name="ServerPTh">存储路径 @"H:桌面截图generate2.png"</param>
            static void Generate(string text,string ServerPth,ImageFormat imgFrt)
            {
                BarcodeWriter writer = new BarcodeWriter();
                //使用ITF 格式,不能被现在常用的支付宝、微信扫出来
                //如果想生成可识别的可以使用 CODE_128 格式
                //writer.Format = BarcodeFormat.ITF;
                writer.Format = BarcodeFormat.CODE_128;
                EncodingOptions options = new EncodingOptions()
                {
                    Width = 150,
                    Height = 50,
                    Margin = 2
                };
                writer.Options = options;
                Bitmap map = writer.Write(text);
                string filename = ServerPth;//请注意 保存格式和文件扩展名一致性
                map.Save(filename, imgFrt);
            }
            #endregion
    
            #region 二维码 条形码读取
            /// <summary>
            /// 二维码 条形码读取
            /// </summary>
            /// <param name="filename">文件路径</param>
            /// <returns></returns>
            static string Read(string filename)
            {
                BarcodeReader reader = new BarcodeReader();
                reader.Options.CharacterSet = "UTF-8";
                Bitmap map = new Bitmap(filename);
                Result result = reader.Decode(map);
                return result == null ? "" : result.Text;
            }
            #endregion
    
            #region C#生成特定颜色二维码-基础版本
            //需要引用ZXing.DLL  可以百度一下  一个很好用的二维码生成程序集《DLL文件啦》
            //使用案例:Bitmap img3 = GenByZXingNet("");
            //使用案例:img3.Save(Server.MapPath(@"	estImgerweima.png"));
            /// <summary>
            /// 生成二维码
            /// </summary>
            /// <param name="msg">二维码信息</param>
            /// <param name="codeSizeInPixels">正方形 边长</param>
            /// <returns>图片</returns>
            public static Bitmap GenByZXingNet_Color(string msg, int codeSizeInPixels = 250)
            {
                BarcodeWriter writer = new BarcodeWriter();
                writer.Renderer = new ZXing.Rendering.BitmapRenderer { Background = Color.Red, Foreground = Color.Blue };
                writer.Format = BarcodeFormat.QR_CODE;
                writer.Options.Hints.Add(EncodeHintType.CHARACTER_SET, "UTF-8");//编码问题
                writer.Options.Hints.Add(EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H);
    
                writer.Options.Height = writer.Options.Width = codeSizeInPixels;
                writer.Options.Margin = 0;//设置边框1            ZXing.Common.BitMatrix bm = writer.Encode(msg);
                Bitmap img = writer.Write(msg);
                return img;
            }
    
            #endregion
        }

       好了,上边的代码复制粘贴,即可用,

       如果你问我原理,那么我只能对你说:请去米国,问问原著的作者吧!有些东东真的没必要钻牛角尖,否则,老师都会嫌弃你!

       嘻嘻,牛逼吹完了,如果你感觉好,就点个赞吧!谢谢。

       @陈卧龙的博客

      

  • 相关阅读:
    字符编码
    mahout 使用
    cloudera Manager使用总结
    HDFS 操作命令总结
    基于hive的日志分析系统
    hive 中的正则表达式
    hadoop 用户
    Java中设置classpath、path、JAVA_HOME的作用
    排序
    动手动脑
  • 原文地址:https://www.cnblogs.com/chenwolong/p/erweima.html
Copyright © 2011-2022 走看看