本次主要分享的是3个免费的二维码接口的对接代码和测试得出的注意点及区别,有更好处理方式多多交流,相互促进进步;最近在学习JavsScript的扩展TypeScript,感觉语法糖很甜,大部分与C#更为类似,可能都是微软项目的原因吧,有兴趣的朋友可以多多相互交流下;
以上是个人的看法,下面来正式分享今天的文章吧:
下面一步一个脚印的来分享:
Google的Api二维码生成接口
首先,这里给出Google接口文档的链接qr_codes文档,热情的朋友马上就会打开此链接吧,详细看下里面的参数这就不做截图了,大致通常用到的参数是:api地址,内容参数,生成图片的高宽这3个参数,其他的几个参数都采用默认的吧,不同需要大家可以更详细的看下;其实第一次看到文档里面的参数,感觉少了一些东西,比如怎么不能传递二维码中间那个图标的图片地址和扫描二维码过后怎么跳转到我想重定向的url链接呢,带着这个疑问我进行了多次的尝试;下面给出自己尝试的结果说明:
其次,上面是个人的一些总结,下面我们来看下封装的请求接口方法和下载二维码图片方法:
#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接口生成的二维码,除了自己通过流下载,还能通过他们后台一起下载所有生成的图片,本人暂时没有去关注是否生成量大了会收费哈哈,下面列举下接口参数说明和测试得出的注意点:
其次,下面给出封装的代码,由于下载和上面介绍的代码一样是公用的这里就不做陈述:
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的参数,故此朋友们可以忽略);下面列举下接口参数说明和测试得出的注意点:
其次,下面给出封装的代码,由于下载和上面介绍的代码一样是公用的这里就不做陈述:
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 }
本篇的分享内容在程序设计方面没有太多,重点是分装下这几个接口和分享下接口的差异,方面朋友们可以拿来主义和正在对接二维码生成的朋友做下交流,仅此而已;关键代码的备注都在分享代码里,有更好或者不清楚的地方欢迎留言,谢谢。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持小牛知识库!
本文向大家介绍iOS 二维码生成及扫码详解及实例代码,包括了iOS 二维码生成及扫码详解及实例代码的使用技巧和注意事项,需要的朋友参考一下 iOS二维码生成及扫码 现在越来越多的应用加入二维码相关的业务,在iOS开发市场上很多开发人员都在使用第三方的扫码与生成二维码的控件,个人认为此类的第三方控件识别度不高。最近正好整理新框架的事情,研究了一下。具体代码如下 生成二维码代码 扫描二维
本文向大家介绍详解ZXing-core生成二维码的方法并解析,包括了详解ZXing-core生成二维码的方法并解析的使用技巧和注意事项,需要的朋友参考一下 二维码无处不在,扫一扫有礼品哦,现在二维码这么流行,想必大家不是很清楚二维码是怎么生成的吧,现在小编通过给大家分享本文帮助大家学习二维码生成的方法。 其实主要是利用goggle发布的jar来使用的此功能。 1、二维码的生成 将Zxing-cor
本文向大家介绍基于Python生成个性二维码过程详解,包括了基于Python生成个性二维码过程详解的使用技巧和注意事项,需要的朋友参考一下 一、问题描述 通过调用MyQR模块来实现生成个人所需二维码。 安装: pip install myqr 二、代码实现 1.普通二维码 效果图: 2.带图片的艺术二维码 光是二维码,太单调了点。我们可以加上我们想要的图片,使二维码更具辨识度! 准备的Logo图片
及策微信小程序二维码生成器,是一个根据小程序相关数据生成二维码的工具。在进行参数设置后,通过用户在不同场景中扫描该场景二维码激活小程序,从而准确帮您获取小程序的渠道推广数据,用户来源。 生成二维码 名称:为二维码定义一个独立的,方便识别的名称; 类型:选择生成小程序的类型; 页面路径:通过扫描将生成的二维码所访问的页面路径。也就是说你可以将任意页面生成为二维码,供用户扫描后直接进入; 参数设置:
1、renderQrCode 用法 renderQrCode 生成二维码极其简单方便,常见用法如下: // 二维码携带的数据 String data = "weixin://wxpay/bizpayurl?appid=xx&mch_id=xx......"; // 渲染二维码图片,长度与宽度为 200 像素 renderQrCode(data, 200, 200); 上例代码中的 data 为该
本文向大家介绍Android中二维码的生成方法(普通二维码、中心Logo 二维码、及扫描解析二维码),包括了Android中二维码的生成方法(普通二维码、中心Logo 二维码、及扫描解析二维码)的使用技巧和注意事项,需要的朋友参考一下 首先声明我们通篇用的都是Google开源框架Zxing,要实现的功能有三个 ,生成普通二维码、生成带有中心图片Logo 的二维码,扫描解析二维码,直接上效果图吧 首