二維碼生成及讀取方法

二維碼的製做主要是引用第三方的程序集ThoughtWorks.QRCode.dll,調用QRCodeEncoder的Encode方法獲得一個Bitmap圖;相反,解析二維碼就是用的Decode方法。算法

以下示例生成二維碼的方法:ide

/// <summary>
        /// 生成不帶logo的二維碼圖片
        /// </summary>
        /// <param name="data">要生成二維碼的字符串</param>
        /// <returns></returns>
        public System.Drawing.Image GCode(String data)
        {
            QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
            String encoding = cboEncoding.Text;//QRCodeEncodeMode是枚舉類型,此處是使用ComboBox給用戶自行選擇
            if (encoding == "Byte")
            {
                qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
            }
            else if (encoding == "AlphaNumeric")
            {
                qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;
            }
            else if (encoding == "Numeric")
            {
                qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC;
            }
            try
            {
                int scale = Convert.ToInt16(txtSize.Text);
                qrCodeEncoder.QRCodeScale = scale;//二維碼尺寸大小
            }
            catch (Exception)
            {
                MessageBox.Show("Invalid size!");
                return null;
            }
            try
            {
                int version = Convert.ToInt16(cboVersion.Text);
                qrCodeEncoder.QRCodeVersion = version;//版本
            }
            catch (Exception)
            {
                MessageBox.Show("Invalid version !");
            }

            string errorCorrect = cboCorrectionLevel.Text;
            if (errorCorrect == "L")
                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;
            else if (errorCorrect == "M")
                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
            else if (errorCorrect == "Q")
                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;
            else if (errorCorrect == "H")
                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;

            Image pbImg = qrCodeEncoder.Encode(data);
            return pbImg;
        }


若是要生成一箇中間帶一個小圖片的二維碼,則須要使用GDI+將圖片畫到已經生成的二維碼圖片上(注意,中間小圖片的大小要控制好,不然可能會遮擋二維碼有效信息,致使讀不出來,):spa

 /// <summary>
        /// 生成帶logo二維碼的圖片
        /// </summary>
        /// <param name="imgBack">背景圖片</param>
        /// <param name="destImg">logo圖片</param>
        /// <returns></returns>
        public static System.Drawing.Image CombinImage(System.Drawing.Image imgBack, string destImg)
        {
            if (imgBack == null)//若是二維碼生成出錯
            {
                return null;
            }
            try
            {
                System.Drawing.Image img = System.Drawing.Image.FromFile(destImg);//拿到logo圖片  
                if (img.Height != 50 || img.Width != 50)
                {
                    img = KiResizeImage(img, 50, 50);//調整logo圖片大小
                }
                Graphics g = Graphics.FromImage(imgBack);
                g.DrawImage(img, imgBack.Width / 2 - img.Width / 2, imgBack.Height / 2 - img.Height / 2, img.Width, img.Height);//把logo畫到二維碼上
                GC.Collect();
                return imgBack;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Logo image error!");//若是選擇的Logo圖片未獲取到,則拋出異常
                return null;
            }
        }

        /// <summary>
        /// 調整logo圖片的大小
        /// </summary>
        /// <param name="bmp">logo圖片</param>
        /// <param name="newW"></param>
        /// <param name="newH"></param>
        /// <returns>返回處理好的圖片</returns>
        public static System.Drawing.Image KiResizeImage(System.Drawing.Image bmp, int newW, int newH)
        {
            try
            {
                System.Drawing.Image b = new Bitmap(newW, newH);//建立一個空白圖片
                Graphics g = Graphics.FromImage(b);//把b圖片當作背景建立畫布
                g.InterpolationMode = InterpolationMode.HighQualityBicubic; // 插值算法的質量

                g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);//把圖片按比例畫到畫布上
                g.Dispose();
                return b;
            }
            catch
            {
                return null;
            }

        }
View Code

 

好了,對於二維碼的製做和解析,以上內容對於使用者基本夠用了,若是感興趣的話,能夠使用Reflector反編譯查看ThoughtWorks.QRCode.dll內部究竟是如何實現的code

相關文章
相關標籤/搜索