详细QRCode生成二维码和下载实现案例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ThoughtWorks.QRCode.Codec;
using System.Drawing;
using System.Drawing.Imaging;
using Game.Utils;
using System.Drawing.Drawing2D;
using Game.Facade;
using System.Net;
using System.IO; namespace Game.Web.WS
{
/// <summary>
/// QRCode 的摘要说明
/// </summary>
public class QRCode : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
GetQRCode(context);
} /// <summary>
/// 绘制二维码
/// </summary>
/// <param name="context"></param>
private void GetQRCode(HttpContext context)
{
string encodeData = GameRequest.GetQueryString("qt");
string icoURL = GameRequest.GetQueryString("qm");
int width = GameRequest.GetQueryInt("qs", );
if (encodeData != string.Empty)
{
calQrcode(encodeData, icoURL, width, context);
}
} /// <summary>
/// 按照指定的大小绘制二维码
/// </summary>
/// <param name="sData"></param>
/// <param name="width"></param>
/// <returns></returns>
private void calQrcode(string sData, string icoURL, int size, HttpContext context)
{
//二维码版本,大小获取
Color qrCodeBackgroundColor = Color.White;
Color qrCodeForegroundColor = Color.Black;
int length = System.Text.Encoding.UTF8.GetBytes(sData).Length; //生成二维码数据
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//使用M纠错级别
qrCodeEncoder.QRCodeVersion = ;
var encodedData = qrCodeEncoder.Encode(sData, System.Text.Encoding.UTF8); //绘制图片
int x = , y = ;
int w = , h = ;
// 二维码矩阵单边数据点数目
int count = encodedData.Length;
// 获取单个数据点边长
double sideLength = Convert.ToDouble(size) / count;
// 初始化背景色画笔
SolidBrush backcolor = new SolidBrush(qrCodeBackgroundColor);
// 初始化前景色画笔
SolidBrush forecolor = new SolidBrush(qrCodeForegroundColor);
// 定义画布
Bitmap image = new Bitmap(size, size);
// 获取GDI+绘图图画
Graphics graph = Graphics.FromImage(image);
// 先填充背景色
graph.FillRectangle(backcolor, , , size, size); // 变量数据矩阵生成二维码
for (int row = ; row < count; row++)
{
for (int col = ; col < count; col++)
{
// 计算数据点矩阵起始坐标和宽高
x = Convert.ToInt32(Math.Round(col * sideLength));
y = Convert.ToInt32(Math.Round(row * sideLength));
w = Convert.ToInt32(Math.Ceiling((col + ) * sideLength) - Math.Floor(col * sideLength));
h = Convert.ToInt32(Math.Ceiling((row + ) * sideLength) - Math.Floor(row * sideLength)); // 绘制数据矩阵
graph.FillRectangle(encodedData[col][row] ? forecolor : backcolor, x, y, w, h);
}
} //添加LOGO
string path = context.Server.MapPath("/favicon.ico");
Bitmap logoImage = null;
FileInfo fileInfo = new FileInfo(path);
if (fileInfo.Exists)
{
logoImage = new Bitmap(path);
}
if (icoURL != "")
{
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(icoURL);
try
{
HttpWebResponse webReponse = (HttpWebResponse)webRequest.GetResponse();
if (webReponse.StatusCode == HttpStatusCode.OK)
{
using (Stream stream = webReponse.GetResponseStream())
{
Image img = Image.FromStream(stream);
logoImage = new Bitmap(img);
img.Dispose();
}
}
}
catch { }
}
if (logoImage != null)
{
image = CoverImage(image, logoImage, graph);
logoImage.Dispose();
}
//输出
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
context.Response.ClearContent();
context.Response.ContentType = "image/png";
context.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode("QRCodeImg.png", System.Text.Encoding.UTF8));
context.Response.BinaryWrite(ms.ToArray());
context.Response.Flush();
context.Response.End();
image.Dispose();
} /// <summary>
/// 层叠图片
/// </summary>
/// <param name="original">原始图片(目前只支持正方形)</param>
/// <param name="image">层叠图片(目前只支持正方形)</param>
/// <returns>处理以后的图片</returns>
private Bitmap CoverImage(Bitmap original, Bitmap image, Graphics graph = null)
{
//缩放附加图片
int sideSLen = original.Width;
int sideTLen = sideSLen / ;
image = ResizeImage(image, sideTLen, sideTLen); // 获取GDI+绘图图画
graph = graph == null ? Graphics.FromImage(original) : graph; // 将附加图片绘制到原始图中央
graph.DrawImage(image, (original.Width - sideTLen) / , (original.Height - sideTLen) / , sideTLen, sideTLen); // 释放GDI+绘图图画内存
graph.Dispose(); // 返回处理结果
return original;
} /// <summary>
/// 图片缩放
/// </summary>
/// <param name="bmp">原始Bitmap</param>
/// <param name="newW">新的宽度</param>
/// <param name="newH">新的高度</param>
/// <returns>处理以后的图片</returns>
private Bitmap ResizeImage(Bitmap original, int width, int height)
{
try
{
Bitmap image = new Bitmap(width, height);
Graphics graph = Graphics.FromImage(image);
// 插值算法的质量
graph.CompositingQuality = CompositingQuality.HighQuality;
graph.SmoothingMode = SmoothingMode.HighQuality;
graph.InterpolationMode = InterpolationMode.HighQualityBicubic;
graph.DrawImage(original, new Rectangle(, , width, height),
new Rectangle(, , original.Width, original.Height), GraphicsUnit.Pixel);
graph.Dispose();
return image;
}
catch
{
return null;
}
} public bool IsReusable
{
get
{
return false;
}
}
}
}
详细QRCode生成二维码和下载实现案例的更多相关文章
- C# 利用QRCode生成二维码图片
网上生成二维码的组件是真多,可是真正好用的,并且生成速度很快的没几个,QRCode就是我在众多中找到的,它的生成速度快.但是网上关于它的使用说明,真的太少了,大都是千篇一律的复制粘贴.这是本要用它做了 ...
- 使用jquery.qrcode生成二维码及常见问题解决方案
转载文章 使用jquery.qrcode生成二维码及常见问题解决方案 一.jquery.qrcode.js介 jquery.qrcode.js 是一个纯浏览器 生成 QRcode 的 jQuery ...
- C#Qrcode生成二维码支持中文,带图片,带文字
C#Qrcode生成二维码支持中文带图片的操作请看二楼的帖子,当然开始需要下载一下C#Qrcode的源码 下载地址 : http://www.codeproject.com/Articles/2057 ...
- QRCode生成二维码,jq QRCode生成二维码,QRCode生成电子名片
[QRCode官网]http://phpqrcode.sourceforge.net/ PHP QRCode生成二维码 官网下载QRCode源码包,引入源码包中的 qrlib.php . <?p ...
- Qrcode生成二维码的参数总结 及最小尺寸的测试
Qrcode生成二维码,做过很多实验,探索最小规格的二维码到底是多少尺寸,和最高规格的二维码到底是多大尺寸.现在我总结总结: 有两种思路: 1.生成规格高的二维码,然后压缩到自己想要的尺寸的二维码.这 ...
- qrcode 生成二维码
qrcode 生成二维码 Demo: https://www.hgnulb.cn/freedom/qrcode/qrcode.html qrcodeGithub 地址: https://github. ...
- python_使用qrcode生成二维码
1.功能 使用qrcode生成二维码 2.代码 #生成二维码: import qrcode #根据url生成二维码 def qrcodeWithUrl(url): img = qrcode.make( ...
- 使用jquery.qrcode生成二维码实现微信分享功能
前言: 最近有个这样的需求,在pc端的商品详情页增加分享功能. 微博分享.QQ好友分享.QQ空间分享这些都很常见.但是微信分享我还没有手动写过(以前改过). 最终效果如下图: 解决方案:使用jquer ...
- jQuery.qrcode 生成二维码,并使用 jszip、FileSaver 下载 zip 压缩包至本地。
生成二维码 引用 jquery.qrcode.js :连接:https://files.cnblogs.com/files/kitty-blog/jquery.qrcode.js .https:// ...
随机推荐
- SpringBoot自动配置原理
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面Spring的文章(以学习的顺序排好): S ...
- 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析
API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...
- pfSense配置基于时间的防火墙规则
基于时间的规则允许防火墙规则在指定的日期和/或时间范围内激活.基于时间的规则与任何其他规则的功能相同,只是它们在预定时间之外的规则集中实际上不存在. 基于时间的规则逻辑处理基于时间的规则时,调度计划确 ...
- css常见的各种布局上(两列布局)
常见的布局上(两列布局) 1.常见的两列布局 1.1左边固定,右边自适应,左边宽度已知,右边默认占满整行,使用left 左浮动,右边不浮动,设置margin-left:左侧宽度 <style&g ...
- 激活效能,CODING 敏捷研发模块上线
昨晚,巴黎圣母院失火,而我们当中的许多人都还没来得及去欣赏它的真容.我们曾以为美好的事物会等待我们,伟大的目标也会等待我们.世事无常,唯一不变的就是变化.在软件研发领域,敏捷研发就是这么一个小步快跑来 ...
- Android studio无法创建类和接口问题解决办法。提示 Unable to parse template "Class"
重新配置了studio 的工作环境, 没问题,后来加需求要新增java类和接口,这就出现问题了,新建的时候,就会报错: Unable to parse template "Interface ...
- QT文件操作
/* 写文件 */ QFile file(filePath); bool bo = file.open(QIODevice::WriteOnly | QIODevice::Append); //qDe ...
- 章节十、7-Xpath---Xpath中绝对路径相对路径的区别
以下演示操作以该网址中的内容为例:https://learn.letskodeit.com/?_ga=2.143454972.85111248.1555037144-697706367.1554889 ...
- Altium Designer快速调整丝印
Altium Designer快速调整丝印 今天我为大家讲的内容是altium designer快速调整丝印,这是我们做完PCB设计布线完成后的下一个步,很多朋友都是非常熟悉的.但是我们很多人只会用a ...
- 积极参与开源项目,促进.NET Core生态社区发展
今天早上在微信群里聊天聊到百度的SDK 已经支持.NET Core, 百度已经在3月份就支持了,想起当时还是我在他们的github上提的issue: https://github.com/Baidu- ...