程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 詳解二維碼生成工廠

詳解二維碼生成工廠

編輯:C#入門知識

詳解二維碼生成工廠。本站提示廣大學習愛好者:(詳解二維碼生成工廠)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解二維碼生成工廠正文


本次次要分享的是3個收費的二維碼接口的對接代碼和測試得出的留意點及區別,有更益處理方式多多交流,互相促進提高;最近在學習JavsScript的擴展TypeScript,覺得語法糖很甜,大局部與C#更為相似,能夠都是微軟項目的緣由吧,有興味的冤家可以多多互相交流下;

以上是團體的看法,上面來正式分享明天的文章吧:

Google的Api二維碼生成接口 2d-code的Api二維碼生成接口 topscan的Api二維碼生成接口 運用面向對象+加載順序集創立對象兼並以上接口封裝成二維碼生成工廠

上面一步一個足跡的來分享:

Google的Api二維碼生成接口

首先,這裡給出Google接口文檔的鏈接qr_codes文檔,熱情的冤家馬上就會翻開此鏈接吧,詳細看下外面的參數這就不做截圖了,大致通常用到的參數是:api地址,內容參數,生成圖片的高寬這3個參數,其他的幾個參數都采用默許的吧,不同需求大家可以更詳細的看下;其實第一次看到文檔外面的參數,覺得少了一些東西,比方怎樣不能傳遞二維碼兩頭那個圖標的圖片地址和掃描二維碼當時怎樣跳轉到我想重定向的url鏈接呢,帶著這個疑問我停止了屢次的嘗試;上面給出自己嘗試的後果闡明:

 接口關鍵參數是:cht(固定值qr),chl(內容參數),chs(生成出來二維碼圖片尺寸,格式如:200x200,這裡是xyz的x不是*) api接口只會生成一個二維碼的圖片流,假如需求把圖片保管到本地需求經過閱讀器直接get訪問接口或許經過順序下載這個二維碼 內容參數假如傳遞文本信息,在生成出來的二維碼圖片兩頭不會顯示文本內容,只要用手機掃描二維碼才干在手機上顯示傳遞的文本信息 內容參數假如傳遞單純的http://格式的鏈接地址,那麼手機掃描後會自動重定向到改http://鏈接地址上(這個掃描重定向可以用來做一些商品或許文章的檢查) google接口暫未研討出此Logo圖標地址參數(希望有冤家研討出來後與我分享,謝謝) 由於api地址是國外的,調用接口呼應不是那麼疾速

其次,下面是團體的一些總結,上面我們來看下封裝的懇求接口辦法和下載二維碼圖片辦法:

#region 生成二維碼

 /// <summary>
 /// 生成二維碼
 /// </summary>
 /// <param name="content">展現內容(文本內容 或許 掃描後的跳轉http://格式的地址)</param>
 /// <param name="savePath">保管二維碼的磁盤途徑(默許順序跟目錄+QRCode)</param>
 /// <param name="logoUrl"> Logo圖標地址(格式:http://),(注:google接口暫未研討出此參數)</param>
 /// <param name="apiUrl">接口地址(內置默許api地址)</param>
 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默許200)</param>
 /// <returns></returns>
 public virtual string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null)
 {
 var qrName = string.Empty;
 #region 參數初始化
 ApiUrl = apiUrl ?? ApiUrl;
 Content = content ?? Content;
 SaveQRPath = savePath ?? SaveQRPath;
 LogoUrl = logoUrl ?? LogoUrl;
 WAndH = wAndh ?? WAndH;
 #endregion
 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; }
 ApiUrl = string.Format("{0}?cht=qr&chl={1}&chs={2}x{2}",
 ApiUrl,
 HttpUtility.UrlEncode(Content),
 WAndH);
 qrName = DownImg(ApiUrl, SaveQRPath, ImageFormat.Jpeg);
 return qrName;
 }
 #endregion

下載二維碼圖片保管到順序根目錄:

#region 下載圖片
 /// <summary>
 /// 下載圖片
 /// </summary>
 /// <param name="url">圖片下載地址</param>
 /// <param name="savePath">保管途徑默許:Img文件夾</param>
 /// <param name="format">默許:Jpeg</param>
 /// <returns>新圖片稱號</returns>
 public virtual string DownImg(string url, string savePath = "QRCode", ImageFormat format = null)
 {
 var qrName = string.Empty;
 try
 {
 format = format ?? ImageFormat.Jpeg;
 HttpClient http = new HttpClient();
 http.Timeout = new TimeSpan(0, 1, 0);
 using (var stream = http.GetStreamAsync(url).Result)
 {
 if (!Directory.Exists(SaveQRPath)) { Directory.CreateDirectory(SaveQRPath); }
 qrName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + format;
 var path = Path.Combine(savePath, qrName);
 using (Image img = Image.FromStream(stream))
 {
 img.Save(path, format);
 }
 }
 }
 catch (Exception ex)
 {
 qrName = string.Empty;
 }
 return qrName;
 }
#endregion

下面兩個辦法運用的是虛辦法,由於我這裡是吧google接口當做默許的二維碼生成器來運用,前面要講的另外兩個接口都是重寫與此;下載圖片的辦法都是公用的,暫不需求重寫;這裡需求提到的是調用api接口時有一個固定的參數cht=qr,這個參數表示采用QR辦法生成二維碼,由於這個api接口還有生成圖標的功用,所以只想要生成二維碼這裡就固定,更多的生成圖標功用不在本章分享中,謝謝。

2d-code的Api二維碼生成接口

首先,該接口需求經過他們官網注冊一個key,然後從後台獲取到這個key後才干調用接口地址,當然注冊後有個功用是,但凡您經過api接口生成的二維碼,除了自己經過流下載,還能經過他們後台一同下載一切生成的圖片,自己暫時沒有去關注能否生成量大了會免費哈哈,上面羅列下接口參數闡明和測試得出的留意點:

接口關鍵參數是:key(注冊獲取),text(文本參數),url(掃描後重定向地址),logo(Logo圖標地址),size(二維碼正方形,高寬) 接口的文本參數只能傳遞文本,不能當做掃描後重定向的地址參數運用和Google等接口有點不一樣 掃描後重定向地址和Logo圖標地址都是可訪問的http://格式的地址鏈接 Logo圖標地址,官方說不建議運用png格式,測試只要jpg成功(能夠是測試不夠多這裡只單純引見我的後果) 生成速度比擬快,而且還有一個藝術字的生成接口,挺不錯 api接口只會生成一個二維碼的圖片流,假如需求把圖片保管到本地需求經過閱讀器直接get訪問接口或許經過順序下載這個二維碼

其次,上面給出封裝的代碼,由於下載和下面引見的代碼一樣是公用的這裡就不做陳說:

public QR_2dCode()
 {
 ApiUrl = "http://www.2d-code.cn/2dcode/api.php";
 }
 #region 生成二維碼
 /// <summary>
 /// 生成二維碼
 /// </summary>
 /// <param name="content">展現內容(文本內容 或許 掃描後的跳轉http://格式的地址)</param>
 /// <param name="savePath">保管二維碼的磁盤途徑(默許順序跟目錄+QRCode)</param>
 /// <param name="logoUrl"> Logo圖標地址(格式:http://),官方不建議運用png格式,測試只要jpg成功</param>
 /// <param name="directUrl">掃描後重定向地址(http://)</param>
 /// <param name="apiUrl">接口地址(內置默許api地址)</param>
 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默許200)</param>
 /// <returns></returns>
 public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null)
 {
 var qrName = string.Empty;
 #region 參數初始化
 ApiUrl = apiUrl ?? ApiUrl;
 Content = content ?? Content;
 SaveQRPath = savePath ?? SaveQRPath;
 LogoUrl = logoUrl ?? LogoUrl;
 WAndH = wAndh ?? WAndH;
 #endregion
 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; }
 ApiUrl = string.Format("{0}?key=c_d800OBbu6hDzJtXPE2Yd02IMtmpuK9VdCqHe6vrtar4&text={1}&url={2}&logo={3}&size={4}",
 ApiUrl,
 HttpUtility.UrlEncode(Content.Contains("http") ? "" : Content),
 HttpUtility.UrlEncode(Content),
 HttpUtility.UrlEncode(LogoUrl),
 WAndH);
 qrName = DownImg(ApiUrl, SaveQRPath);
 return qrName;
 }
#endregion

topscan的Api二維碼生成接口

首先,該接口一定是收費的,參數描繪和google的差不多,不同處在於可以傳遞Logo圖標地址(當然能夠我還沒發現google的可以傳遞logo的參數,故此冤家們可以疏忽);上面羅列下接口參數闡明和測試得出的留意點:

接口關鍵參數是:text(內容參數),logo(Logo圖標地址),w(生成出來二維碼圖片尺寸,格式如:200x200,這裡是xyz的x不是*) api接口只會生成一個二維碼的圖片流,假如需求把圖片保管到本地需求經過閱讀器直接get訪問接口或許經過順序下載這個二維碼 內容參數假如傳遞文本信息,在生成出來的二維碼圖片兩頭不會顯示文本內容,只要用手機掃描二維碼才干在手機上顯示傳遞的文本信息 內容參數假如傳遞單純的http://格式的鏈接地址,那麼手機掃描後會自動重定向到改http://鏈接地址上(這個掃描重定向可以用來做一些商品或許文章的檢查) Logo圖標地址(格式:http://),jpg,png測試經過 測試得出有時分懇求生成二維碼不前往數據,有能夠是我網路問題吧,正常生成二維碼的速度還是挺快

其次,上面給出封裝的代碼,由於下載和下面引見的代碼一樣是公用的這裡就不做陳說:

public QR_TopScan()
 {
 ApiUrl = "http://qr.topscan.com/api.php";
 }
 #region 生成二維碼
 /// <summary>
 /// 生成二維碼
 /// </summary>
 /// <param name="content">展現內容(文本內容 或許 掃描後的跳轉http://格式的地址)</param>
 /// <param name="savePath">保管二維碼的磁盤途徑(默許順序跟目錄+QRCode)</param>
 /// <param name="logoUrl"> Logo圖標地址(格式:http://),jpg,png測試經過,測試得出有不能成功的,緣由不知能否和地址有關</param>
 /// <param name="apiUrl">接口地址(內置默許api地址)</param>
 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默許200)</param>
 /// <returns></returns>
 public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null)
 {
 var qrName = string.Empty;
 #region 參數初始化
 ApiUrl = apiUrl ?? ApiUrl;
 Content = content ?? Content;
 SaveQRPath = savePath ?? SaveQRPath;
 LogoUrl = logoUrl ?? LogoUrl;
 WAndH = wAndh ?? WAndH;
 #endregion
 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; }
 ApiUrl = string.Format("{0}?text={1}&logo={2}&w={3}",
 ApiUrl,
 HttpUtility.UrlEncode(Content),
 HttpUtility.UrlEncode(LogoUrl),
 WAndH);
 qrName = DownImg(ApiUrl, SaveQRPath);
 return qrName;
 }
#endregion

運用面向對象+加載順序集創立對象兼並以上接口封裝成二維碼生成工廠

首先,剖析下面3個接口的參數可以看出,都需求固定的參數:接口api,內容(文本或跳轉http地址),Logo圖片地址(google暫時除外),寬度和高度等這幾個參數,這樣一來咋們可以定義個一致參數類,來傳遞該參數信息,這裡還要提下由於這幾個接口都是從他人接口獲取圖片流,假如想要吧圖片在執行順序時分直接保管在我們的順序本地,都需求下載,所以又多一個參數: 保管二維碼的磁盤途徑,所以才有了一下公共的屬性:

#region 根底配相信息
 /// <summary>
 /// 接口地址(必填)
 /// </summary>
 protected string ApiUrl = "https://chart.googleapis.com/chart";
 /// <summary>
 /// 展現內容(文本內容),google文本參數直接傳遞http地址直接重定向
 /// </summary>
 protected string Content = "http://www.cnblogs.com/wangrudong003/";
 /// <summary>
 /// 保管二維碼的磁盤途徑(默許順序跟目錄+QRCode)
 /// </summary>
 protected string SaveQRPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "QRCode");
 /// <summary>
 /// Logo圖片地址(http://)
 /// </summary>
 protected string LogoUrl = "http://a.hiphotos.baidu.com/baike/w%3D268%3Bg%3D0/sign=9a34e44d8bd4b31cf03c93bdbfed4042/2cf5e0fe9925bc318cb9fe965edf8db1ca1370dc.jpg";
 /// <summary>
 /// 寬度和高度(二維碼正方形的,高寬一至,默許200)
 /// </summary>
 protected int WAndH = 200;
#endregion

然後,這裡我不想每個接口都手動new一次來創立對象,所以用了加載順序集的模塊的方式來創立所需求的對象,因而有了工廠類的入口:

/// <summary>
 /// 二維碼生成工廠
 /// </summary>
 public class QRCodeReposity
 {
 public static BaseQRCode Current(QREmType qrEmType = QREmType.BaseQRCode)
 {
 var nspace = typeof(BaseQRCode);
 var fullName = nspace.FullName;
 var nowspace = fullName.Substring(0, fullName.LastIndexOf('.') + 1);
 return Assembly.GetExecutingAssembly().CreateInstance(nowspace + qrEmType.ToString(), true) as BaseQRCode;
 }
 }

這裡和之前的緩存工廠文章設計差不多,可以查閱下之前的分享篇,也多多點贊,謝謝;上面在給出說有的代碼如下:

/// <summary>
 /// 工廠模塊定義
 /// </summary>
 public enum QREmType
 {
 /// <summary>
 /// google接口
 /// </summary>
 BaseQRCode,
 /// <summary>
 /// 2d-code接口
 /// </summary>
 QR_2dCode,
 /// <summary>
 /// topscan接口
 /// </summary>
 QR_TopScan
 }
 /// <summary>
 /// 二維碼生成工廠
 /// </summary>
 public class QRCodeReposity
 {
 public static BaseQRCode Current(QREmType qrEmType = QREmType.BaseQRCode)
 {
 var nspace = typeof(BaseQRCode);
 var fullName = nspace.FullName;
 var nowspace = fullName.Substring(0, fullName.LastIndexOf('.') + 1);
 return Assembly.GetExecutingAssembly().CreateInstance(nowspace + qrEmType.ToString(), true) as BaseQRCode;
 }
 }
 /// <summary>
 /// 基類運用Google提供Api:https://developers.google.com/chart/infographics/docs/qr_codes ,由於是國外地址,絕對來說有點慢
 /// </summary>
 public class BaseQRCode
 {
 #region 根底配相信息
 /// <summary>
 /// 接口地址(必填)
 /// </summary>
 protected string ApiUrl = "https://chart.googleapis.com/chart";
 /// <summary>
 /// 展現內容(文本內容),google文本參數直接傳遞http地址直接重定向
 /// </summary>
 protected string Content = "http://www.cnblogs.com/wangrudong003/";
 /// <summary>
 /// 保管二維碼的磁盤途徑(默許順序跟目錄+QRCode)
 /// </summary>
 protected string SaveQRPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "QRCode");
 /// <summary>
 /// Logo圖片地址(http://)
 /// </summary>
 protected string LogoUrl = "http://a.hiphotos.baidu.com/baike/w%3D268%3Bg%3D0/sign=9a34e44d8bd4b31cf03c93bdbfed4042/2cf5e0fe9925bc318cb9fe965edf8db1ca1370dc.jpg";
 /// <summary>
 /// 寬度和高度(二維碼正方形的,高寬一至,默許200)
 /// </summary>
 protected int WAndH = 200;
 #endregion
 #region 辦法
 #region 生成二維碼
 /// <summary>
 /// 生成二維碼
 /// </summary>
 /// <param name="content">展現內容(文本內容 或許 掃描後的跳轉http://格式的地址)</param>
 /// <param name="savePath">保管二維碼的磁盤途徑(默許順序跟目錄+QRCode)</param>
 /// <param name="logoUrl"> Logo圖標地址(格式:http://),(注:google接口暫未研討出此參數)</param>
 /// <param name="apiUrl">接口地址(內置默許api地址)</param>
 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默許200)</param>
 /// <returns></returns>
 public virtual string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null)
 {
 var qrName = string.Empty;
 #region 參數初始化
 ApiUrl = apiUrl ?? ApiUrl;
 Content = content ?? Content;
 SaveQRPath = savePath ?? SaveQRPath;
 LogoUrl = logoUrl ?? LogoUrl;
 WAndH = wAndh ?? WAndH;
 #endregion
 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; }
 ApiUrl = string.Format("{0}?cht=qr&chl={1}&chs={2}x{2}",
 ApiUrl,
 HttpUtility.UrlEncode(Content),
 WAndH);
 qrName = DownImg(ApiUrl, SaveQRPath, ImageFormat.Jpeg);
 return qrName;
 }
 #endregion
 #region 下載圖片
 /// <summary>
 /// 下載圖片
 /// </summary>
 /// <param name="url">圖片下載地址</param>
 /// <param name="savePath">保管途徑默許:Img文件夾</param>
 /// <param name="format">默許:Jpeg</param>
 /// <returns>新圖片稱號</returns>
 public virtual string DownImg(string url, string savePath = "QRCode", ImageFormat format = null)
 {
 var qrName = string.Empty;
 try
 {
 format = format ?? ImageFormat.Jpeg;
 HttpClient http = new HttpClient();
 http.Timeout = new TimeSpan(0, 1, 0);
 using (var stream = http.GetStreamAsync(url).Result)
 {
 if (!Directory.Exists(SaveQRPath)) { Directory.CreateDirectory(SaveQRPath); }
 qrName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + format;
 var path = Path.Combine(savePath, qrName);
 using (Image img = Image.FromStream(stream))
 {
 img.Save(path, format);
 }
 }
 }
 catch (Exception ex)
 {
 qrName = string.Empty;
 }
 return qrName;
 }
 #endregion
 #endregion
 }
 /// <summary>
 /// 運用2d-code提供Api,需求去官網注冊獲取Key
 /// </summary>
 public class QR_2dCode : BaseQRCode
 {
 public QR_2dCode()
 {
 ApiUrl = "http://www.2d-code.cn/2dcode/api.php";
 }
 #region 生成二維碼
 /// <summary>
 /// 生成二維碼
 /// </summary>
 /// <param name="content">展現內容(文本內容 或許 掃描後的跳轉http://格式的地址)</param>
 /// <param name="savePath">保管二維碼的磁盤途徑(默許順序跟目錄+QRCode)</param>
 /// <param name="logoUrl"> Logo圖標地址(格式:http://),官方不建議運用png格式,測試只要jpg成功</param>
 /// <param name="directUrl">掃描後重定向地址(http://)</param>
 /// <param name="apiUrl">接口地址(內置默許api地址)</param>
 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默許200)</param>
 /// <returns></returns>
 public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null)
 {
 var qrName = string.Empty;
 #region 參數初始化
 ApiUrl = apiUrl ?? ApiUrl;
 Content = content ?? Content;
 SaveQRPath = savePath ?? SaveQRPath;
 LogoUrl = logoUrl ?? LogoUrl;
 WAndH = wAndh ?? WAndH;
 #endregion
 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; }
 ApiUrl = string.Format("{0}?key=c_d800OBbu6hDzJtXPE2Yd02IMtmpuK9VdCqHe6vrtar4&text={1}&url={2}&logo={3}&size={4}",
 ApiUrl,
 HttpUtility.UrlEncode(Content.Contains("http") ? "" : Content),
 HttpUtility.UrlEncode(Content),
 HttpUtility.UrlEncode(LogoUrl),
 WAndH);
 qrName = DownImg(ApiUrl, SaveQRPath);
 return qrName;
 }
 #endregion
 }
 /// <summary>
 /// 運用topscan提供Api
 /// </summary>
 public class QR_TopScan : BaseQRCode
 {
 public QR_TopScan()
 {
 ApiUrl = "http://qr.topscan.com/api.php";
 }
 #region 生成二維碼
 /// <summary>
 /// 生成二維碼
 /// </summary>
 /// <param name="content">展現內容(文本內容 或許 掃描後的跳轉http://格式的地址)</param>
 /// <param name="savePath">保管二維碼的磁盤途徑(默許順序跟目錄+QRCode)</param>
 /// <param name="logoUrl"> Logo圖標地址(格式:http://),jpg,png測試經過,測試得出有不能成功的,緣由不知能否和地址有關</param>
 /// <param name="apiUrl">接口地址(內置默許api地址)</param>
 /// <param name="wAndh">寬度和高度(二維碼正方形的,高寬一至,默許200)</param>
 /// <returns></returns>
 public override string CreateQRCode(string content = null, string savePath = null, string logoUrl = null, string apiUrl = null, int? wAndh = null)
 {
 var qrName = string.Empty;
 #region 參數初始化
 ApiUrl = apiUrl ?? ApiUrl;
 Content = content ?? Content;
 SaveQRPath = savePath ?? SaveQRPath;
 LogoUrl = logoUrl ?? LogoUrl;
 WAndH = wAndh ?? WAndH;
 #endregion
 if (string.IsNullOrEmpty(ApiUrl)) { return qrName; }
 ApiUrl = string.Format("{0}?text={1}&logo={2}&w={3}",
 ApiUrl,
 HttpUtility.UrlEncode(Content),
 HttpUtility.UrlEncode(LogoUrl),
 WAndH);
 qrName = DownImg(ApiUrl, SaveQRPath);
 return qrName;
 }
 #endregion
 }

本篇的分享內容在順序設計方面沒有太多,重點是分裝下這幾個接口和分享下接口的差別,方面冤家們可以拿來主義和正在對接二維碼生成的冤家做下交流,僅此而已;關鍵代碼的備注都在分享代碼裡,有更好或許不清楚的中央歡送留言,謝謝。

以上就是本文的全部內容,希望本文的內容對大家的學習或許任務能帶來一定的協助,同時也希望多多支持!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved