C#基于QRCode实现动态生成自定义二维码图片功能示例
作者:changuncle 发布时间:2023-04-03 04:08:43
标签:C#,QRCode,二维码
本文实例讲述了C#基于QRCode实现动态生成自定义二维码图片功能。分享给大家供大家参考,具体如下:
二维码早就传遍大江南北了,总以为它是个神奇的东西,其实细细研究之后发现也没想象的那么神秘,碰巧最近项目中需要动态生成二维码,解决完实际问题之后,简单总结整理一下。项目中除了动态生成二维码之外,还实现了动态生成自定义图片,二维码可以是其中的元素。
设置图片的数据源为动态图片
<body>
<form id="form1" runat="server" >
<div>
<img src="GenerateImage.aspx?type=2" />
</div>
</form>
</body>
动态生成图片
GenerateImage.aspx.cs文件内容
protected void Page_Load(object sender, EventArgs e)
{
string type = Request.QueryString["type"].ToString();
Bitmap codeImage = Create_QRCode("分享才能获得更多,我尽力而为(5201314)", 6);
MemoryStream ms = Create_ImgCode(codeImage, "分享才能获得更多,我尽力而为", "5201314", type);
Response.ClearContent();
Response.ContentType = "image/Png";
Response.BinaryWrite(ms.ToArray());
Response.End();
}
private Bitmap Create_QRCode(string codeNumber, int size)
{
//创建二维码生成类
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
//设置编码模式
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
//设置编码测量度
qrCodeEncoder.QRCodeScale = size;
//设置编码版本
qrCodeEncoder.QRCodeVersion = 10;
//设置编码错误纠正
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
//生成二维码图片
System.Drawing.Bitmap codeImage = qrCodeEncoder.Encode(codeNumber, Encoding.UTF8);
return codeImage;
}
/// <summary>
/// 生成自定义图片
/// </summary>
/// <param name="codeImage">生成的二维码</param>
/// <param name="objectName">物体名称</param>
/// <returns>自定义图片内存流</returns>
private MemoryStream Create_ImgCode(Bitmap codeImage, string objectName, string objectCode, string type)
{
string path = string.Empty;
if (type == "1")
{
//设置背景图片
path = Server.MapPath("Images/backimg1.png");
}
else if (type == "2")
{
//设置背景图片
path = Server.MapPath("Images/backimg2.png");
}
System.Drawing.Image img = System.Drawing.Image.FromFile(path);
Bitmap bg = new Bitmap(img);
//为画布bg(图片bg)创建一只画笔
Graphics g = Graphics.FromImage(bg);
if (type == "1")
{
//【1】将位图文件codeImage画到画布g上
//【2】codeImage左上角距画布左边界25px、距画布上边界56px
//【3】codeImage的长为原长、宽为原宽
g.DrawImage(codeImage, 25, 56, codeImage.Width, codeImage.Height);
}
else if (type == "2")
{
g.DrawImage(codeImage, 132, 19, 162, 162);
System.Drawing.Brush b = new SolidBrush(Color.Black);
Font font = new Font("宋体", 8, FontStyle.Regular);
StringFormat sf = new StringFormat();
sf.LineAlignment = StringAlignment.Center; // 垂直居中
sf.Alignment = StringAlignment.Near; // 水平左对齐
//string也是画到画布上的,当画的string长度大于112px时会自动换行
SizeF stringSize = g.MeasureString("我的宣言:", font, 112, sf);
int nWidth = (int)stringSize.Width + 1;
int nHeight = (int)stringSize.Height + 1;
RectangleF rf = new Rectangle(new Point(12, 64), new Size(nWidth, nHeight));
g.DrawString("我的宣言:", font, b, rf, sf);
stringSize = g.MeasureString(objectName, font, 112, sf);
int objectWidth = (int)stringSize.Width + 1;
int objectHeight = (int)stringSize.Height + 1;
rf = new Rectangle(new Point(12, 64 + nHeight + 8), new Size(objectWidth, objectHeight));
g.DrawString(objectName, font, b, rf, sf);
SizeF stringSize1 = g.MeasureString("幸运数字:", font, 112, sf);
nWidth = (int)stringSize1.Width + 1;
nHeight = (int)stringSize1.Height + 1;
RectangleF rf1 = new Rectangle(new Point(12, 136), new Size(nWidth, nHeight));
g.DrawString("幸运数字:", font, b, rf1, sf);
stringSize1 = g.MeasureString(objectCode, font, 112, sf);
objectWidth = (int)stringSize1.Width + 1;
objectHeight = (int)stringSize1.Height + 1;
rf1 = new Rectangle(new Point(12, 136 + nHeight + 8), new Size(objectWidth, objectHeight));
g.DrawString(objectCode, font, b, rf1, sf);
}
g.Dispose();
GC.Collect();
System.IO.MemoryStream ms = new System.IO.MemoryStream();
bg.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
//将画布bg(图片bg)保存到指定路径
path = Server.MapPath("Images");
bg.Save(path + "\\photoName.png", System.Drawing.Imaging.ImageFormat.Png);
codeImage.Dispose();
bg.Dispose();
return ms;
}
ThoughtWorks.QRCode.dll点击此处本站下载。
PS:本站还提供了一个功能十分强悍的在线二维码生成工具,可实现文本、电话号码、短信、邮件、网址等的二维码生成及logo图标添加功能:
在线生成二维码工具(加强版):
http://tools.jb51.net/transcoding/jb51qrcode
希望本文所述对大家C#程序设计有所帮助。
来源:https://blog.csdn.net/xiaouncle/article/details/52588947


猜你喜欢
- 该功能本来可以通过拉动水平和垂直滚动条来实现,但实际使用中,用户更趋向于直接用鼠标拖动页面来实现,很多看图类软件都有这种类似的功能。而.ne
- Android系统支持的颜色是由4个值组成的,前3个为RGB,也就是我们常说的三原色(红、绿、蓝),最后一个值是A,也就是Alpha。这4个
- android中提供了4中动画: AlphaAnimation 透明度动画效果 ScaleAnimation 缩放动画效果 Translat
- 随着使用Spring进行开发的个人和企业越来越多,Spring从一个单一简介的框架变成了一个大而全的开源软件,最直观的变化就是Spring需
- 本文实例讲述了C#集合遍历时删除和增加元素的方法。分享给大家供大家参考,具体如下:大多数时候,遍历集合元素的时候并不需要对元素进行增加或者删
- 前言列表在我们的日常开发中使用的频率是非常高的,像下图的歌曲播放列表,或者课程展示,那么这些场景都需要我们用到点击事件,点击歌曲播放歌曲,点
- 专业的Android app开发人员会关注一些成熟的项目管理技术,以成功构建Android app,并让这个app在Google Play
- @SuppressWarnings比较常见,理解和使用起来都很简单。通过源码可以看出,支持在类、属性、方法、参数、构造方法、本地变量上使用。
- 背景:有时候string类型的数据取出来是个很标准的key、value形式,通过Gson的可以直接转成map使用方式:Gson gson =
- 一、点睛邻接矩阵通常采用一个一维数组存储图中节点的信息,采用一个二维数组存储图中节点之间的邻接关系。邻接矩阵可以用来表示无向图、有向图和网。
- 使用ByteArrayOutputStream下载文件//文件名称String filepath = ServletActionContex
- 了解了inbound事件的传播过程, 对于学习outbound事件传输的流程, 也不会太困难outbound事件传输流程在我们业务代码中,
- java 避免出现NullPointerException(空指针)的方法总结Java应用中抛出的空指针异常是解决空指针的最好方式,也是写出
- 上一节我们完成了使用DataGrid显示所有商品信息,这节我们开始添加几个功能:添加、更新、删除和查询。首先我们实现下前台的显示,然后再做后
- 反编译jar包并修改class文件重新打包这两天碰到一个需求:需要修改一个jar包中的逻辑代码,并且重新打包本来是很简单的问题,但是因为这个
- 一:背景1. 讲故事这几天都在修复bug真的太忙了,期间也遇到了一个挺有趣bug,和大家分享一下,这是一块sql挺复杂的报表相关业务,不知道
- 概念优先级队列是一种先进先出(FIFO)的数据结构,与队列不同的是,操作的数据带有优先级,通俗的讲就是可以比较大小,在出队列的时候往往需要优
- 简介: 很多软件为了安全防止恶意攻击,会在登录/注册时进行人机验证,常见的人机验证方式有:谷歌点击复选框进行验证,输入验证码验证,短信验证码
- 激活码:9MWZD5CC4E-eyJsaWNlbnNlSWQiOiI5TVdaRDVDQzRFIiwibGljZW5zZWVOY
- 半藏商城中会有一些用户提交了订单但是一直没有支付的情况,之前我是通过quartz定时任务每天的5点扫描未支付订单然后读取用户的邮箱地址发送邮