详细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:// ...
随机推荐
- 为什么VUE注册组件命名时不能用大写的?
这段时间一直在弄vue,当然也遇到很多问题,这里就来跟大家分享一些注册自定义模板组件的心得 首先"VUE注册组件命名时不能用大写"其实这句话是不对的,但我们很多人开始都觉得是对的, ...
- synchronized关键字简介 多线程中篇(十一)
前面说过,Java对象都有与之关联的一个内部锁和监视器 内部锁是一种排它锁,能够保障原子性.可见性.有序性 从Java语言层面上说,内部锁使用synchronized关键字实现 synchronize ...
- Node 框架接入 ELK 实践总结
本文由云+社区发表 作者:J2X 我们都有过上机器查日志的经历,当集群数量增多的时候,这种原始的操作带来的低效率不仅给我们定位现网问题带来极大的挑战,同时,我们也无法对我们服务框架的各项指标进行有效的 ...
- mysql 多实例部署
Centos7.6 部署3个Mariadb 实例 [root@localhost ~]# yum install mariadb-server -y # 创建对应的目录文件 [root@localho ...
- 一、Java 23 种设计模式简介
一.23种设计模式分类: 二.设计模式的六大原则: 1.开闭原则(Open Close Principle):对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效 ...
- Android开发利器之stetho
文章同步自javaexception Stetho是什么? github上地址https://github.com/facebook/stetho stetho是facebook出品的一款开发调试工具 ...
- crontab常用
--crontab检查是否安装[oracle@rac1 ~]$ rpm -qa | grep crontabcrontabs-1.10-8启动与关闭[oracle@rac1 ~]$ /etc/init ...
- 《Python黑客编程之极速入门》正式开课
玄魂 玄魂工作室 今天 之前开启了一个<Python黑客编程>的系列,后来中断了,内容当时设置的比较宽,不太适合入门.现在将其拆分成两个系列<Python黑客编程之极速入门>和 ...
- .Net之Nopi Excel数据导出和批量导入功能
一.介绍NPOI和编写demo的原因 1.Npoi是什么: 它是一个专门用于读写Microsoft Office二进制和OOXML文件格式的.NET库,我们使用它能够轻松的实现对应数据的导入,导出功能 ...
- mpvue小程序开发之 集成第三方UI框架Vant Weapp UI
集成进第三方的UI框架其实很简单 这里把vant-weapp的dist目录重命名为vant-weapp放在项目根目录的static文件夹下: 在src文件夹下,即我们写vue代码的位置,正在编写的页面 ...