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_Solution\QrCode\QrCode\Images\101.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(@"\testImg\erweima.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(@"\testImg\erweima.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
    }

   好了,上邊的代碼復制粘貼,即可用,

   如果你問我原理,那么我只能對你說:請去米國,問問原著的作者吧!有些東東真的沒必要鑽牛角尖,否則,老師都會嫌棄你!

   嘻嘻,牛逼吹完了,如果你感覺好,就點個贊吧!謝謝。

   @陳卧龍的博客

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM