C#實現二維碼的生成與解析

參考原帖:C# 二維碼 生成、解析

項目源碼:請別搶我閃刀姬/MakeBarCode

前言

一直覺得二維碼頗神奇,前一段還經常在手機上用一個DIY二維碼的軟件。今天剛好看到了這位大佬的文章,就拿來學習一下。一來記錄一下,二來練習一下上傳源碼。

頁面設計

在這裏插入圖片描述
頁面內容很少,左邊是一個pictureBox,用來存放二維碼圖片,右邊一個文本框,用來輸入製作二維碼的內容或者顯示識別二維碼的結果,下面三個button,用來打開新圖片,保存生成的二維碼圖片,如果識別結果爲鏈接可以點擊“轉到”,使用默認瀏覽器打開鏈接。(話說大佬的頁面更簡潔,打開圖片都是用拖放的,保存和轉到都是右鍵菜單,但我學半天也沒有學會拖放打開圖片,只好先製作一個縮水版。)

代碼實現部分

定義變量

首先定義一個是否更新的變量,因爲生成和識別所使用同一個文本框,所以要加以判斷當前狀態。

        bool update = true;

生成二維碼

當文本框內容發生變化且當前狀態爲生成二維碼時,獲取當前文本框的內容調用方法進行製作。

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (update)
            {
                String url = textBox1.Text;
                if (!url.Equals(""))
                {
                    Bitmap pic = ToQR(url);
                    pictureBox1.Image = pic;
                }
            }
        }

保存二維碼

單擊“保存”且圖片框的內容不爲空時,彈出保存對話框,選擇路徑,通過保存方法將圖片保存到指定位置。

        private void save_Click(object sender, System.EventArgs e)
        {
            if (pictureBox1.Image != null)
            {
                Bitmap pic = new Bitmap(pictureBox1.Image);
                SaveFileDialog saveFileDialog1 = new SaveFileDialog();
                saveFileDialog1.Filter = "png files(*.png)|*.png|All files(*.*)|*.*";    //設置文件類型 
                saveFileDialog1.FilterIndex = 2;                                     //設置默認文件類型顯示順序 
                saveFileDialog1.RestoreDirectory = true;                             //保存對話框是否記憶上次打開的目錄 
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    string localFilePath = saveFileDialog1.FileName.ToString();
                    Save(pic, localFilePath);
                }
            }
        }

打開新的圖片

單擊“打開”後彈出打開文件對話框,選擇後將圖片展示在圖像框內,將解析結果顯示在文本框內。

        private void Open_Click(object sender, System.EventArgs e)
        {
            OpenFileDialog open = new OpenFileDialog();
            if (open.ShowDialog() == DialogResult.OK)
            {
                Image pic = Bitmap.FromFile(open.FileName);
                pictureBox1.Image = pic;
                update = false;
                String code = ToCode(new Bitmap(pic));
                textBox1.Text = code;
                update = true;
            }
        }

轉到識別鏈接

格式正確則轉到,格式錯誤則提示。

        private void go_Click(object sender, System.EventArgs e)
        {
            try
            {
                if (!textBox1.Text.Equals("")) System.Diagnostics.Process.Start(textBox1.Text);
            }
            catch (Exception)
            {
                MessageBox.Show("請檢查網址或路徑是否正確");
            }
        }

功能性函數

生成鏈接地址對應的二維碼圖像

        public static Bitmap ToQR(String url)
        {
            QrEncoder qrEncoder = new QrEncoder(ErrorCorrectionLevel.M);
            QrCode qrCode = qrEncoder.Encode(url);
            GraphicsRenderer render = new GraphicsRenderer(new FixedModuleSize(5, QuietZoneModules.Two), Brushes.Black, Brushes.White);
            DrawingSize size = render.SizeCalculator.GetSize(qrCode.Matrix.Width);
            Bitmap pic = new Bitmap(size.CodeWidth, size.CodeWidth);
            Graphics g = Graphics.FromImage(pic);
            render.Draw(g, qrCode.Matrix);
            return pic;
        }

解析二維碼圖像轉化爲編碼串

        public static string ToCode(Bitmap pic)
        {
            QRCodeDecoder decoder = new QRCodeDecoder();
            String decodedString = decoder.decode(new QRCodeBitmapImage(pic));
            return decodedString;
        }

按指定路徑保存圖像

        public static void Save(Bitmap pic, String filePath)
        {
            if (File.Exists(filePath)) File.Delete(filePath);
            pic.Save(filePath, ImageFormat.Png);
        }

運行效果

在這裏插入圖片描述
這裏演示一下生成二維碼,識別的截圖與此差距不大。

結語

因爲剛剛接觸,所以表述上可能會有差錯,主要就是感受一下完成時的喜悅。不足之處,望見諒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章