二維碼產生及讀取方法

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   os   io   

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

如下樣本產生二維碼的方法:

/// <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+將圖片畫到已經產生的二維碼圖片上(注意,中間小圖片的大小要控制好,否則可能會遮擋二維碼有效資訊,導致讀不出來,):

 /// <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內部到底是如何?的

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.