參考原帖: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);
}
運行效果
這裏演示一下生成二維碼,識別的截圖與此差距不大。
結語
因爲剛剛接觸,所以表述上可能會有差錯,主要就是感受一下完成時的喜悅。不足之處,望見諒。