.net core 生成二维码
其实生成二维码的组件有很多种,如:QrcodeNet,ZKWeb.Fork.QRCoder,QRCoder等
我选QRCoder,是因为小而易用、支持大并发生成请求、不依赖任何库和网络服务。
既然是.net core 那当然要用依赖注入,通过构造函数注入到控制器。
软件版本
Asp.net Core:2.0
QRCoder:1.3.3(开发时最新)
项目结构
Snai.QRCode.Api Asp.net core 2.0 Api网站
项目实现
新建Snai.QRCode解决方案,在解决方案下新建一个名Snai.QRCode.Api Asp.net core 2.0 Api网站
在 依赖项 右击 管理NuGet程序包 浏览 找到 QRCoder 版本1.3.3 下载安装
由于使用依赖注入,依赖抽象不依赖实现,所以要建一个实现二维码的接口
在项目添加 Common 文件夹,在文件夹添加 IQRCode 二维码接口,接口定义 GetQRCode 二维码方法,代码如下
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks; namespace Snai.QRCode.Api.Common
{
public interface IQRCode
{
Bitmap GetQRCode(string url, int pixel);
}
}
在 Common 目录下添加 RaffQRCode 类,继承IQRCode接口实现GetQRCode类,代码如下
using QRCoder;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks; namespace Snai.QRCode.Api.Common
{
public class RaffQRCode : IQRCode
{
/// <summary>
///
/// </summary>
/// <param name="url">存储内容</param>
/// <param name="pixel">像素大小</param>
/// <returns></returns>
public Bitmap GetQRCode(string url, int pixel)
{
QRCodeGenerator generator = new QRCodeGenerator();
QRCodeData codeData = generator.CreateQrCode(url, QRCodeGenerator.ECCLevel.M, true);
QRCoder.QRCode qrcode = new QRCoder.QRCode(codeData); Bitmap qrImage = qrcode.GetGraphic(pixel, Color.Black, Color.White, true); return qrImage;
}
}
}
修改Startup.cs代码,注入RaffQRCode类到容器
aaarticlea/png;base64,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" alt="" />
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Snai.QRCode.Api.Common; namespace Snai.QRCode.Api
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IQRCode, RaffQRCode>();
services.AddMvc();
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseMvc();
}
}
}
在Controllers 下添加QRCodeController Api空的控制器,采用构造函数依赖,引入RaffQRCode类
添加GetQRCode(string url, int pixel)方法,加入HttpGet("/api/qrcode")路由地址,方法里使用_iQRCode.GetQRCode(url, pixel)生成二维码再输出
aaarticlea/png;base64,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" alt="" />
代码如下:
using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Snai.QRCode.Api.Common; namespace Snai.QRCode.Api.Controllers
{
public class QRCodeController : Controller
{
private IQRCode _iQRCode; public QRCodeController(IQRCode iQRCode)
{
_iQRCode = iQRCode;
} /// <summary>
/// 获取二维码
/// </summary>
/// <param name="url">存储内容</param>
/// <param name="pixel">像素大小</param>
/// <returns></returns>
[HttpGet("/api/qrcode")]
public void GetQRCode(string url, int pixel)
{
Response.ContentType = "image/jpeg"; var bitmap = _iQRCode.GetQRCode(url, pixel);
MemoryStream ms = new MemoryStream();
bitmap.Save(ms, ImageFormat.Jpeg); Response.Body.WriteAsync(ms.GetBuffer(), 0, Convert.ToInt32(ms.Length));
Response.Body.Close();
}
}
}
到此所有代码都已编写完成
启动运行项目,在浏览器打开 http://localhost:5000//api/qrcode?url=http://www.baidu.com&pixel=4 地址,得到url参数域名的二维码
/* GetGraphic方法参数说明
public Bitmap GetGraphic(int pixelsPerModule, Color darkColor, Color lightColor, Bitmap icon = null, int iconSizePercent = 15, int iconBorderWidth = 6, bool drawQuietZones = true)
*
int pixelsPerModule:生成二维码图片的像素大小 ,我这里设置的是5
*
Color darkColor:暗色 一般设置为Color.Black 黑色
*
Color lightColor:亮色 一般设置为Color.White 白色
*
Bitmap icon :二维码 水印图标 例如:Bitmap icon = new Bitmap(context.Server.MapPath("~/images/zs.png")); 默认为NULL ,加上这个二维码中间会显示一个图标
*
int iconSizePercent: 水印图标的大小比例 ,可根据自己的喜好设置
*
int iconBorderWidth: 水印图标的边框
*
bool drawQuietZones:静止区,位于二维码某一边的空白边界,用来阻止读者获取与正在浏览的二维码无关的信息 即是否绘画二维码的空白边框区域 默认为true
*/
Github源码地址:https://github.com/Liu-Alan/Snai.QRCode
.net core 生成二维码的更多相关文章
- Asp.Net Core 生成二维码(NuGet使用QRCoder)
前言 功能:调用web api 接口 1.获取 jpeg 格式的二维码 2.获取中间带有logo 的二维码 3. 下载 jpeg,svg 格式的二维码 需要的NuGet 包: > QRCoder ...
- com.google.zxing:core 生成二维码的简单使用
String content = ""; int size = 240; Hashtable<EncodeHintType, String> hints = new H ...
- C# 动态创建SQL数据库(二) 在.net core web项目中生成二维码 后台Post/Get 请求接口 方式 WebForm 页面ajax 请求后台页面 方法 实现输入框小数多 自动进位展示,编辑时实际值不变 快速掌握Gif动态图实现代码 C#处理和对接HTTP接口请求
C# 动态创建SQL数据库(二) 使用Entity Framework 创建数据库与表 前面文章有说到使用SQL语句动态创建数据库与数据表,这次直接使用Entriy Framwork 的ORM对象关 ...
- 基于Asp.Net Core,利用ZXing来生成二维码的一般流程
本文主要介绍如何在.net环境下,基于Asp.Net Core,利用ZXing来生成二维码的一般操作.对二维码工作原理了解,详情见:https://blog.csdn.net/weixin_36191 ...
- Java使用ZXing生成二维码条形码
一.下载Zxingjar包 本实例使用的是 zxing3.2.0的版本 下载地址 http://pan.baidu.com/s/1gdH7PzP 说明:本实例使用的3.2.0版本已经使用的java7 ...
- java生成二维码图片
1.POM文件引入 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core& ...
- java springMVC生成二维码
Zxing是Google提供的工具,提供了二维码的生成与解析的方法,现在使用Java利用Zxing生成二维码 1),二维码的生成 将Zxing-core.jar 包加入到classpath下. 我的下 ...
- 基于java生成二维码
二维码 二维码的概念 ...
- 如何使用 libqr 库生成二维码?
使用 libqr 库只需 4 步即可生成二维码 1.初始化 QRCode 结构体 QRCode *qrInit(int version, int mode, int eclevel, int mask ...
随机推荐
- Tunnel Warfare (区间合并|最大值最小值巧妙方法)
Tunnel Warfare http://acm.hdu.edu.cn/showproblem.php?pid=1540 Time Limit: 4000/2000 MS (Java/Others) ...
- ArrayList与LinkedList的基本添加删除方法 模拟栈 队列
ArrayList LinkedList ArrayList的add是在末尾添加 linkedlist也是 offer加在末尾 poll获取并移除此列表的头(第一个元素) peek 获取第一个但不移 ...
- dede搜索页面上某些标签无法使用
dede默认的搜索模板是search.htm,但在模板文件中使用{dede:type}{/dede:type}或{dede:flink}{/dede:flink}时,发现标签并没有被解析,显示为空. ...
- apache配置防盗链
1.确保apache已开启rewrite. 2.在.htaccess文件中添加如下: RewriteEngine On RewriteCond %{HTTP_REFERER} !^http://X ...
- WebApi是轻量级的,WCF是重量级的,可以Api调用WCF,更灵活
WCF.WebAPI.WCFREST.WebService之间的区别 注明:转载 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在 ...
- Codeforces 670D1. Magic Powder - 1 暴力
D1. Magic Powder - 1 time limit per test: 1 second memory limit per test: 256 megabytes input: stand ...
- 理解OAuth 2.0 (摘自阮一峰网络日志)
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为R ...
- [BAT]批处理脚本双击可运行,但在定时计划任务中无法执行(当前工作路径不对导致的)
一开始,红色部分我是用set AutoPath=%cd%,双击可执行,但是将这个批处理脚本放在定时任务中无法执行,后来发现在定时执行的时候,当前工作路径不是批处理脚本所在的路径,而是C:/Window ...
- Hadoop 系列(一)基本概念
Hadoop 系列(一)基本概念 一.Hadoop 简介 Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构,它可以使用户在不了解分布式底层细节的情況下开发分布式程序,充分利用集群 ...
- 还在手工制作APP规范文档?这款设计神器你不容错过
之前写了一些关于APP原型文档的文章:一款APP的交互文档从撰写到交付 这次想写下关于APP设计规范文档的内容,规范文档这个东西,实际上大部分中小型公司没有这方面的需求,也没精力去制作这样一个系统性的 ...