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生成二维码和下载实现案例的更多相关文章

  1. C# 利用QRCode生成二维码图片

    网上生成二维码的组件是真多,可是真正好用的,并且生成速度很快的没几个,QRCode就是我在众多中找到的,它的生成速度快.但是网上关于它的使用说明,真的太少了,大都是千篇一律的复制粘贴.这是本要用它做了 ...

  2. 使用jquery.qrcode生成二维码及常见问题解决方案

    转载文章  使用jquery.qrcode生成二维码及常见问题解决方案 一.jquery.qrcode.js介 jquery.qrcode.js 是一个纯浏览器 生成 QRcode 的 jQuery ...

  3. C#Qrcode生成二维码支持中文,带图片,带文字

    C#Qrcode生成二维码支持中文带图片的操作请看二楼的帖子,当然开始需要下载一下C#Qrcode的源码 下载地址 : http://www.codeproject.com/Articles/2057 ...

  4. QRCode生成二维码,jq QRCode生成二维码,QRCode生成电子名片

    [QRCode官网]http://phpqrcode.sourceforge.net/ PHP QRCode生成二维码 官网下载QRCode源码包,引入源码包中的 qrlib.php . <?p ...

  5. Qrcode生成二维码的参数总结 及最小尺寸的测试

    Qrcode生成二维码,做过很多实验,探索最小规格的二维码到底是多少尺寸,和最高规格的二维码到底是多大尺寸.现在我总结总结: 有两种思路: 1.生成规格高的二维码,然后压缩到自己想要的尺寸的二维码.这 ...

  6. qrcode 生成二维码

    qrcode 生成二维码 Demo: https://www.hgnulb.cn/freedom/qrcode/qrcode.html qrcodeGithub 地址: https://github. ...

  7. python_使用qrcode生成二维码

    1.功能 使用qrcode生成二维码 2.代码 #生成二维码: import qrcode #根据url生成二维码 def qrcodeWithUrl(url): img = qrcode.make( ...

  8. 使用jquery.qrcode生成二维码实现微信分享功能

    前言: 最近有个这样的需求,在pc端的商品详情页增加分享功能. 微博分享.QQ好友分享.QQ空间分享这些都很常见.但是微信分享我还没有手动写过(以前改过). 最终效果如下图: 解决方案:使用jquer ...

  9. jQuery.qrcode 生成二维码,并使用 jszip、FileSaver 下载 zip 压缩包至本地。

    生成二维码 引用 jquery.qrcode.js  :连接:https://files.cnblogs.com/files/kitty-blog/jquery.qrcode.js .https:// ...

随机推荐

  1. Docker -v 对挂载的目录没有权限 Permission denied

    1.问题 今天在使用docker挂载redis的时候老是报错 docker run -v /home/redis/redis.conf:/usr/local/etc/redis/redis.conf ...

  2. vue项目,axios请求图片接口,接口返回的是文件流的形式,如何转换成图片?

    axios .get('/captcha', { params: param, responseType: 'arraybuffer' }) .then(response => { return ...

  3. easyui表格自动换行

    表格内容自动换行可以通过设计表格属性  nowrap:false来实现,默认值为true: 但是easyui并未提供,表头自动换行的解决方案,因为一般我们的数据表格列名都是固定的,想换行的话可以通过& ...

  4. GDAL读取的坐标起点在像素左上角还是像素中心?

    目录 1. 问题 2. 结论 3. 例外 1. 问题 笔者在处理地理栅格数据的时候,总是会发生偏差半个像素的问题. 比如说通过ArcMap打开一张.tif,查看其地理信息:同时用记事本打开.tfw,比 ...

  5. Android Studio 受不了了

    今天遇到一个问题,受不了了,来吐槽一下: Android Studio 里面创建两个工程:app, baselib.一个是App 一个是库.编译不过去. targetSdkVersion 26 imp ...

  6. 数据库原理 - 序列3 - 事务是如何实现的? - Redo Log解析

    6.5 事务实现原理之1:Redo Log 介绍事务怎么用后,下面探讨事务的实现原理.事务有ACID四个核心属性:A:原子性.事务要么不执行,要么完全执行.如果执行到一半,宕机重启,已执行的一半要回滚 ...

  7. Pycharm配置Git和Github

    安装Git(安装过程略) 注册Github(注册过程略) Pycharm配置 Github配置 进入Pycharm后点File——Settings,进入设置页面,依次展开Version Control ...

  8. 初识Djiango

    老师的博客:点我 内容主要是看老师的博客 下面是自己的写的某些自己当时不太懂的. 关于Django的版本的问题 Django官网下载页面 在官网上显示lts的是表示支持长期版本.所以最好下载1.11版 ...

  9. 两个inline-block中间有空白,解决inline-block 元素之间的空白问题

    目录 一.遇到的问题 二.举个简单的栗子分析问题 三.解决办法 一.遇到的问题 前些天写瀑布流布局的时候,发现明明计算好了宽度使得一行能放下三张图片,实际效果却总是放不下,图片会挤到下一行去.上图: ...

  10. linux 上安装多个不同版本的mysql 踩的坑

    最近由于业务需要,考虑使用json类型,据了解 mysql 在版本5.7中可以支持 json 类型的数据支持,但同时目前开发环境中使用的是 mysql 5.6版本,上面还有很多项目的数据库在上面,同时 ...