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. POLARDB · 最佳实践 · POLARDB不得不知道的秘密(二)

    前言 POLARDB For MySQL(下文简称POLARDB)目前是阿里云数据库团队主推的关系型数据库.线上已经有很多企业用户在使用并且稳定运行了很久.当然,由于POLARDB是为云上环境专门打造 ...

  2. kubernetes实践之三:深入理解Pod对象

    一.Pod定义 最小部署单元 一组容器集合 一个pod中的容器共享网络命名空间 Pod是短暂的 二.Pod容器分类 基础容器 维护整个Pod的网络命名空间 初始化容器 先于业务容器开始执行,在应用启动 ...

  3. C#简单继承示例详解——快速入门

    在面向对象当中继承是非常重要的,也是面向对象的三大特性之一(继承.封装.多态),今天我们来揭开他的神秘面纱. 话不多说,我们上菜. using System; using System.Collect ...

  4. C# 创建含多层分类标签的Excel图表

    相较于数据,图表更能直观的体现数据的变化趋势.在数据表格中,同一数据值,可能同时代表不同的数据分类,表现在图表中则是一个数据体现在多个数据分类标签下.通常生成的图表一般默认只有一种分类标签,下面的方法 ...

  5. linux高级编程

    系统调用 01.什么是系统调用? 02.Linux系统调用之I/O操作(文件操作) 03.文件描述符的复制:dup(), dup2() 多进程实现多任务 04.进程的介绍 05.Linux可执行文件结 ...

  6. ArcPy 批量给shp字段赋值

    工作中需要做大量图层的拼接,为了在拼接完成后还能知道原始数据文件是什么,所以写了个Python脚本对每个图层的SOURCE字段进行赋值. 附上Python代码: # -*- coding: utf-8 ...

  7. 安卓开发笔记(十八):实现button按钮事件的三种方法

    Android开发中有三种主要的方式用于设置View的点击事件,1.创建内部类:2.主类中实现OnClickListener接口:3.使用匿名内部类.这三种方式都用到了OnClickListener接 ...

  8. RationalRose 安装过程中无法加载镜像的问题

    前情提要:本文主要以提供关键问题的解决思路为目的,境况紧急的,在核对好所遇问题与博主是否一致后,可以直接跳到最后看解决办法即可. 另外,本文重要部分采用不同色文字,加以强调. 任务:安装Rationa ...

  9. 利用requirejs实现vue的模块化开发

    通常vue都是搭配webpack+vue-cli使用的 如果不在nodejs环境下开发web应用呢? 这里提出一个解决方案: 1.加载requirejs,并且指定main函数 <script d ...

  10. “Validation failed for one or more entities”异常的解决办法

    日志中出现Entity Framework修改数据库时的错误: Validation failed for one or more entities. See 'EntityValidationErr ...