.netcore 生成中間有logo圖示的二維碼
阿新 • • 發佈:2020-08-18
本文介紹在.netcore 平臺下,使用 ThoughtWorks.QRCode.Core 生成中間有logo圖示的二維碼
第一步:NuGet 新增 ThoughtWorks.QRCode.Core:
第二步:編寫程式碼
public class QRCodeHelper
{
public static string GetQRCode()
{
using (System.Drawing.Image qrCodeImg = GenerateQRCode("1234567890abcdefghABCDEFGH唐宋元明清")) //生成的二維碼 { //生成二維碼中間logo的圖片。 string logoImgPath = $"{AppDomain.CurrentDomain.BaseDirectory}/Assets/ContactQRCode/QRCodeLogo.png"; using (System.Drawing.Image logoImg = System.Drawing.Image.FromFile(logoImgPath)) { //組合 二維碼和logo,形成帶logo的二維碼,並儲存 string qrCodeImgPath = $"{AppDomain.CurrentDomain.BaseDirectory}/Assets/ContactQRCode/22.png"; CombinImage(qrCodeImg, logoImg).Save(qrCodeImgPath); return qrCodeImgPath; } } } /// <summary> /// 生成二維碼:根據傳進去的資料 生成二維碼 /// </summary> /// <param name="data">用於生成二維碼的資料</param> /// <returns></returns> public static System.Drawing.Image GenerateQRCode(String data) { //建立編碼器,設定編碼格式。Byte格式的編碼,只要能轉成Byte的資料,都可以進行編碼,比如中文。NUMERIC 只能編碼數字。 QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(); qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE; //大小,值越大生成的二維碼圖片畫素越高 qrCodeEncoder.QRCodeScale = 5; //版本,設定為0主要是防止編碼的字串太長時發生錯誤 qrCodeEncoder.QRCodeVersion = 0; //生成二維碼 Bitmap qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;//錯誤效驗、錯誤更正(有4個等級) qrCodeEncoder.QRCodeBackgroundColor = System.Drawing.Color.White;//背景色 qrCodeEncoder.QRCodeForegroundColor = System.Drawing.Color.Black;//前景色 var pbImg = qrCodeEncoder.Encode(data, System.Text.Encoding.UTF8); return pbImg; } /// <summary> /// 給二維碼中間新增圖片(logo):將二維碼作為背景圖片,把小的logo圖片放入背景圖片的正中央。 /// </summary> /// <param name="backgroundImg">背景圖片(此處為二維碼)</param> /// <param name="logoImg">logo 圖片</param> public static System.Drawing.Image CombinImage(System.Drawing.Image backgroundImg, System.Drawing.Image logoImg) { using (Graphics g = Graphics.FromImage(backgroundImg)) { //畫背景(二維碼)圖片,指定開始座標為 x:0,y:0,指定背景圖片寬高。 g.DrawImage(backgroundImg, 0, 0, backgroundImg.Width, backgroundImg.Height); //logo 圖片,重新設定圖片寬高 logoImg = ResizeImage(logoImg, 30, 30, 0); //logo四周刷一層紅色邊框 //g.FillRectangle(System.Drawing.Brushes.Red, backgroundImg.Width / 2 - img.Width / 2 - 1, backgroundImg.Width / 2 - img.Width / 2 - 1, 32, 32); //畫logo圖片,設定座標位置,讓其居於正中央。 g.DrawImage(logoImg, backgroundImg.Width / 2 - logoImg.Width / 2, backgroundImg.Width / 2 - logoImg.Width / 2, logoImg.Width, logoImg.Height); return backgroundImg; } } /// <summary> /// 重新設定圖片的寬高 /// </summary> /// <param name="bmp">原始Bitmap</param> /// <param name="newW">新的寬度</param> /// <param name="newH">新的高度</param> /// <param name="Mode">保留著,暫時未用</param> /// <returns>重新設定寬高後的圖片</returns> public static System.Drawing.Image ResizeImage(System.Drawing.Image bmp, int newW, int newH, int Mode) { System.Drawing.Image b = new Bitmap(newW, newH); using (Graphics g = Graphics.FromImage(b)) { g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel); return b; } } }