在學校的物流實驗室做項目的同學問我瞭解不瞭解QRCode的一些內容,恰好之前有做過這方面的小應用,於是整理總結了一下C#中操作QRCode的方法,首先先要瞭解一下什麼是QRCode,藉著物聯網概念,跟QRCode有關的硬體實體與軟體應用在我們身邊越來越多,不知將來有一天是否會徹底改變我們的生活?
QR 代碼是二維條碼的一種,QR 來自英文 “Quick Response” 的縮寫,即快速反應的意思,源自發明者希望 QR 代碼可讓其內容快速被解碼。QR碼比普通條碼可儲存更多資料,亦無需像普通條碼般在掃描時需直線對準掃描器。 QR 代碼呈正方形,只有黑白兩色。在4個角落的其中3個,印有較小,像“回”字的的正方圖案。這 3 個是協助解碼軟體定位的圖案,使用者不需要對準,無論以任何角度掃描,資料仍可正確被讀取。 更詳細介紹。
QRCode在生活中有著多方面的應用,例如火車票上有QRCode可以用來儲存資訊,現在很多手機軟體都提供掃描QRCode下載,而一號店網上商店在上海地鐵那裡開設有“牆貼超市”,路人只要用手機掃描某商品的QRCode即可下單購買等等。而從開發人員的角度來看,主要包括有建立QRCode與讀取QRCode資訊兩方面的需求。在這裡主要考慮用C#去實現QR Code的建立與讀取。
一、QR Code的建立方法一
建立QR Code的方式有多種,比較簡單的是直接引用別人已經編譯好的Dll即可實現功能,下載那dll並添加引用後即可使用。
關鍵的代碼如下:
private void QRCode_Click(object sender, RoutedEventArgs e) { QRCodeWriter qrWrite = new QRCodeWriter(); ByteMatrix bm = qrWrite.encode(TxtSource.Text, BarcodeFormat.QR_CODE, 150, 150); this.QrImg.Source = ConvertByteMartixToWriteableBitmap(bm); } public WriteableBitmap ConvertByteMartixToWriteableBitmap(ByteMatrix bm) { WriteableBitmap wb = new WriteableBitmap(bm.Width, bm.Height); for (int x = 0; x <= wb.PixelWidth - 1; x++) { for (int y = 0; y <= wb.PixelHeight - 1; y++) { if (bm.Array[y][x] == -1) { //白色 wb.Pixels[wb.PixelWidth * y + x] = BitConverter.ToInt32(BitConverter.GetBytes(0xffffffff), 0); } else { //黑色 wb.Pixels[wb.PixelWidth * y + x] = BitConverter.ToInt32(BitConverter.GetBytes(0xff000000), 0); } } } return wb; }
二、QR Code的建立方法二
還有一種更為簡單的方式就是通過Google Chart API 來產生QR Code,調用代碼如下:
private void btnCreate_Click(object sender, RoutedEventArgs e) { var imgSrc = "http://chart.apis.google.com/chart?chs=" + this.txtSize.Text + "&chl=" + this.txtContent.Text + "&choe=UTF-8&cht=qr"; imgSource.Source=(new BitmapImage(new Uri(imgSrc))); }
也就是說需要使用者提供兩個參數,一個為產生QR Code映像的大小,以及要產生QR Code所包含的內容。
三、QR Code的讀取
QR Code建立後當然就是需要去讀取裡面的資訊了,與建立QR Code方法一中相似,我們需要通過那個dll提供的函數去識別QR Code裡的內容,代碼如下:
private void btnReadQRCode_Click(object sender, RoutedEventArgs e) { WriteableBitmap wb = new WriteableBitmap(imageSource, null); QRCodeReader qrRead = new QRCodeReader(); RGBLuminanceSource luminiance = new RGBLuminanceSource(wb, wb.PixelWidth, wb.PixelHeight); HybridBinarizer binarizer = new HybridBinarizer(luminiance); BinaryBitmap binBitmap = new BinaryBitmap(binarizer); Result results; try { results = qrRead.decode(binBitmap); txtShow.Text = results.Text; } catch (Exception ex) { txtShow.Text = "Error:" + ex.GetType() + ":" + ex.Message; } }
先載入入要查詢的QR Code圖片,然後就可以通過這個方式來擷取QR Code裡的資訊。