DotNet二維碼操作組件ThoughtWorks.QRCode

來源:互聯網
上載者:User

標籤:hmm   www   his   製造   image   開源   跟蹤   介紹   cal   

DotNet二維碼操作組件ThoughtWorks.QRCode

在生活中有一種東西幾乎已經快要成為我們的另一個電子”身份證“,那就是二維碼。無論是在軟體開發的過程中,還是在普通使用者的日常中,幾乎都離不開二維碼。二維碼 (dimensional barcode) ,又稱二維條碼,是在一維條碼的基礎上擴充出的一種具有可讀性的條碼。裝置掃描二維條碼,通過識別條碼的長度和寬度中所記載的位元據,可擷取其中所包含的資訊。相比一維條碼,二維碼記載更複雜的資料,比片、網路連結等。

   今天介紹一種免費開源的二維碼操作組件,ThoughtWorks.QRCode組件可以高效而穩定的產生我們需要的二維碼,接下來我們詳細的瞭解一下這個組件。

一.ThoughtWorks.QRCode組件概述:

     QRCode庫是一個.NET組件,可用於編碼和解碼QRCode。 QRCode是源自日本的二維條碼。 現在,它廣泛應用於廣泛的工業領域。 用於車輛組件跟蹤和庫存管理。QR代表“快速反應”。 它是日本公司Denso-Wave在1994年建立的,目的是高速解碼內容。 如今,QR碼被用於手機中以緩解資料輸入。QRCode還可以列印在名片上或顯示在任何顯示器上,然後可以由行動電話捕獲,只要行動電話具有讀取QRCode的軟體。QRCode庫提供的功能包括:將內容編碼為QR碼映像,可以儲存為JPEG,GIF,PNG或位元影像格式;解碼QR碼映像。

    該庫可用於任何.NET 2.0 Windows應用程式,ASP.NET Web應用程式或Windows Mobile裝置應用程式。以下是該組件的聲明”本文以及任何相關的原始碼和檔案均已獲得代碼項目開放許可證(CPOL)許可“。

二.ThoughtWorks.QRCode相關核心對象和方法解析:

    有關ThoughtWorks.QRCode的主要類如下:

     以上是採用.NET Reflector對DLL檔案進行反編譯,以此查看原始碼。由於我只是下載了DLL檔案,沒有下載源碼,所以直接利用.NET Reflector查看源碼,接下來具體介紹一下組件的一些類和方法:

   1.QRCodeEncoder:二維碼編碼類別。
public enum ENCODE_MODE{    ALPHA_NUMERIC,    NUMERIC,    BYTE}public enum ERROR_CORRECTION{    L,    M,    Q,    H}public virtual Bitmap Encode(string content, Encoding encoding){    bool[][] flagArray = this.calQrcode(encoding.GetBytes(content));    SolidBrush brush = new SolidBrush(this.qrCodeBackgroundColor);    Bitmap image = new Bitmap((flagArray.Length * this.qrCodeScale) + 1, (flagArray.Length * this.qrCodeScale) + 1);    Graphics graphics = Graphics.FromImage(image);    graphics.FillRectangle(brush, new Rectangle(0, 0, image.Width, image.Height));    brush.Color = this.qrCodeForegroundColor;    for (int i = 0; i < flagArray.Length; i++)    {        for (int j = 0; j < flagArray.Length; j++)        {            if (flagArray[j][i])            {                graphics.FillRectangle(brush, j * this.qrCodeScale, i * this.qrCodeScale, this.qrCodeScale, this.qrCodeScale);            }        }    }    return image;}
   2.QRCodeDecoder:二維碼解碼類。
public virtual string decode(QRCodeImage qrCodeImage, Encoding encoding){    sbyte[] src = this.decodeBytes(qrCodeImage);    byte[] dst = new byte[src.Length];    Buffer.BlockCopy(src, 0, dst, 0, dst.Length);    return encoding.GetString(dst);} public virtual sbyte[] decodeBytes(QRCodeImage qrCodeImage){    DecodeResult result;    Point[] adjustPoints = this.AdjustPoints;    ArrayList list = ArrayList.Synchronized(new ArrayList(10));    while (this.numTryDecode < adjustPoints.Length)    {        try        {            result = this.decode(qrCodeImage, adjustPoints[this.numTryDecode]);            if (result.CorrectionSucceeded)            {                return result.DecodedBytes;            }            list.Add(result);            canvas.println("Decoding succeeded but could not correct");            canvas.println("all errors. Retrying..");        }        catch (DecodingFailedException exception)        {            if (exception.Message.IndexOf("Finder Pattern") >= 0)            {                throw exception;            }        }        finally        {            this.numTryDecode++;        }    }    if (list.Count == 0)    {        throw new DecodingFailedException("Give up decoding");    }    int num = -1;    int numErrors = 0x7fffffff;    for (int i = 0; i < list.Count; i++)    {        result = (DecodeResult) list[i];        if (result.NumErrors < numErrors)        {            numErrors = result.NumErrors;            num = i;        }    }    canvas.println("All trials need for correct error");    canvas.println("Reporting #" + num + " that,");    canvas.println("corrected minimum errors (" + numErrors + ")");    canvas.println("Decoding finished.");    return ((DecodeResult) list[num]).DecodedBytes;}
   3.QRCodeBitmapImage:位元影像映像。
public class QRCodeBitmapImage : QRCodeImage{    // Fields    private Bitmap image;    // Methods    public QRCodeBitmapImage(Bitmap image);    public virtual int getPixel(int x, int y);    // Properties    public virtual int Height { get; }    public virtual int Width { get; }}
public interface QRCodeImage{    // Methods    int getPixel(int x, int y);    // Properties    int Height { get; }    int Width { get; }}

   以上是對ThoughtWorks.QRCode組件的一些方法的介紹,如果需要瞭解更多的方法,可以查看對應的源碼。

三.ThoughtWorks.QRCode二維碼操作執行個體:    1.產生二維碼(對二維碼沒有進行設定)。
        /// <summary>        /// 產生二維碼        /// </summary>        /// <param name="content">帶產生二維碼的字串</param>        /// <param name="path">路徑</param>        /// <returns></returns>        public static string CreatehoughtWorksQrCode(string content, string path)        {            if (string.IsNullOrEmpty(content))            {                throw new ArgumentNullException(content);            }            if (string.IsNullOrEmpty(path))            {                throw new ArgumentNullException(path);            }            var qrCodeEncoder = new QRCodeEncoder            {                QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE,                QRCodeScale = 4,                QRCodeVersion = 8,                QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M            };            Image image = qrCodeEncoder.Encode(content);            var filename = DateTime.Now.ToString("yyyymmddhhmmssfff") + ".jpg";            var filepath = string.Format("{0}{1}", path, filename);            FileStream fs = null;            try            {                fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write);                image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);            }            catch (IOException ex)            {                throw new IOException(ex.Message);            }            finally            {                if (fs != null) fs.Close();                image.Dispose();            }            return CodeDecoder(filepath);        }
    2.選擇產生二維碼的相互關聯類型。
        /// <summary>        /// 選擇產生二維碼的相互關聯類型        /// <param name="strData">要產生的文字或者數字,支援中文。如: "4408810820 深圳-廣州" 或者:4444444444</param>        /// <param name="qrEncoding">三種尺寸:BYTE ,ALPHA_NUMERIC,NUMERIC</param>        /// <param name="level">大小:L M Q H</param>        /// <param name="version">版本:如 8</param>        /// <param name="scale">比例:如 4</param>        /// <returns></returns>        /// </summary>        public void CreateCode_Choose(string strData, string qrEncoding, string level, int version, int scale)        {            if (string.IsNullOrEmpty(strData))            {                throw new ArgumentNullException(strData);            }            if (string.IsNullOrEmpty(qrEncoding))            {                throw new ArgumentNullException(qrEncoding);            }            if (string.IsNullOrEmpty(level))            {                throw new ArgumentNullException(level);            }            var qrCodeEncoder = new QRCodeEncoder();            var encoding = qrEncoding;            switch (encoding)            {                case "Byte":                    qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;                    break;                case "AlphaNumeric":                    qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;                    break;                case "Numeric":                    qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC;                    break;                default:                    qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;                    break;            }            qrCodeEncoder.QRCodeScale = scale;            qrCodeEncoder.QRCodeVersion = version;            switch (level)            {                case "L":                    qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;                    break;                case "M":                    qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;                    break;                case "Q":                    qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;                    break;                default:                    qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;                    break;            }            Image image = null;            FileStream fs = null;            try            {                //文字產生圖片                image = qrCodeEncoder.Encode(strData);                var filename = DateTime.Now.ToString("yyyymmddhhmmssfff") + ".jpg";                var filepath = HttpContext.Current.Server.MapPath(@"~\Upload") + "\\" + filename;                fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write);                image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);            }            catch (IOException ioex)            {                throw new IOException(ioex.Message);            }            catch (Exception ex)            {                throw new Exception(ex.Message);            }            finally            {                if (fs != null) fs.Close();                if (image != null) image.Dispose();            }        }
   3.二維碼解碼。
        /// <summary>        /// 二維碼解碼        /// </summary>        /// <param name="filePath">圖片路徑</param>        /// <returns></returns>        public static string CodeDecoder(string filePath)        {            if (string.IsNullOrEmpty(filePath))            {                throw new ArgumentNullException(filePath);            }            try            {                if (!File.Exists(filePath))                    return null;                var myBitmap = new Bitmap(Image.FromFile(filePath));                var decoder = new QRCodeDecoder();                var decodedString = decoder.decode(new QRCodeBitmapImage(myBitmap));                return decodedString;            }            catch (Exception ex)            {                throw new Exception(ex.Message);            }        }
四.總結:

    跟以前介紹組件一樣,首先是組件的概述,組件的核心類,組件的使用方法,這些在這個組件時,找改組件的相關概述時,花了不少時間,也不知道為何,這個組件沒有找到相關的資料,甚至連作者都是以某某某代替,最後還是在這裡找到一些介紹:https://www.codeproject.com/articles/20574/open-source-qrcode-library。但是互連網就是如此,我們不需要知道是誰製造的,只要用起來方便就可以。在產生二維碼的組件和js外掛程式中,我個人還是喜歡這個組件的,感覺很不錯,任何組件和方法都是有個人偏好和使用環境,讀者可以自行根據情況選擇。

   由於開發人員提供了一個demo,可以直接進入上面的連結中查看下載,在這裡就不做一個樣本介紹。

DotNet二維碼操作組件ThoughtWorks.QRCode

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.