C# 二维码生成支持汉字中间带图片
前言
此篇文章适合一些一脸懵逼开发二维码的人群,相信通过这篇文章能让你对二维码的认知从一无所知到牛逼到死,感谢我吧!骚年。。!!
在写代码之前我觉得应该先讲一下二维码原理以及规则,每个区域的小黑快都有着什么含义。
一. 二维码基本知识
二维码另一个名称是QR Code(Quick Response Code),近年来在移动设备上经常使用,与传统条形码相比,可以存储更多的信息。二维码本质上是个密码算法,基本知识总结如下。
首先,二维码存在 40 种尺寸,在官方文档中,尺寸又被命名为 Version。尺寸与 Version 存在线性关系:Version 1 是 21×21 的矩阵,Version 2 是 25×25 的矩阵,每增加一个 Version,尺寸都会增加 4,故尺寸 Size 与 Version 的线性关系为:
Size=(Version−1)×4Size=(Version−1)×4
Version 的最大值是 40,故尺寸最大值是(40-1)*4+21 = 177,即 177 x 177 的矩阵。
二维码结构如下图 1.1 所示:
图1.1 二维码结构
二维码的各部分都有自己的作用,基本上可被分为定位、功能数据、数据内容三部分。
- 定位图案:
- Position Detection Pattern, 定位图案:用于标记二维码矩形的大小;用三个定位图案即可标识并确定一个二维码矩形的位置和方向了;
- Separators for Position Detection Patterns, 定位图案分割器:用白边框将定位图案与其他区域区分;
- Timing Patterns, 时序图案:用于定位,二维码如果尺寸过大,扫描时容易畸变,时序图案的作用就是防止扫描时畸变的产生;
- Alignment Patterns, 对齐图案:只有在 Version 2 及其以上才会需要;
- 功能数据:
- Format Information, 格式信息:存在于所有尺寸中,存放格式化数据;
- Version Information, 版本信息:用于 Version 7 以上,需要预留两块 3×6 的区域存放部分版本信息;
- 数据内容:剩余部分存储数据内容
- Data Code, 数据码;
- Error Correction Code, 纠错码;
有趣的我粘贴就粘贴一半,剩下的就让他随缘而去吧。毕竟搞懂这些就已经足够了,可爱的你,如果还是想深究,请戳https://blog.csdn.net/ajianyingxiaoqinghan/article/details/78837864
二. 二维码代码编写
二维码的生成用了一个DLL,叫做ThoughtWorks.QRCode。相信你也已经在网上搜索到了。的却,很贵!面对可爱的你,我决定无偿!!赠送!!https://pan.baidu.com/s/1D2a6MLrYNCxzabRTBtY3iA 密码:ndzq
首先在你的项目里添加这个引用。
然后在你的文件里添加下面的代码。
#region 生成二维码
public string GetQRCode()
{
string FullPath = string.Empty;
try
{
//需要生成的文字
string enCodeString = Context.Request["QRStr"];
if (string.IsNullOrEmpty(enCodeString))
{
enCodeString = "如此可爱的你";
}
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
//二维码背景颜色
qrCodeEncoder.QRCodeBackgroundColor = System.Drawing.Color.White;
//二维码编码方式
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
//每个小方格的宽度
qrCodeEncoder.QRCodeScale = 4;
//版本号越大生成的二维码越大最大为40
qrCodeEncoder.QRCodeVersion = 8;
//纠错率级别
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
System.Drawing.Image image = qrCodeEncoder.Encode(enCodeString, Encoding.UTF8);
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
//图片格式制定为png
Image img = CombinImage(image, HttpContext.Current.Server.MapPath("~/Images/hblogo.png"));//这里设置中间图片的路径
img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
saveQRCode(img, HttpContext.Current.Server.MapPath("~/") + "/qrimage/");
//清除缓冲区流中的所有输出
Context.Response.ClearContent();
//输出流的HTTP MIME类型设置为"image/Png"
Context.Response.ContentType = "image/Png";
//输出图片的二进制流
Context.Response.BinaryWrite(ms.ToArray());
}
}
catch (Exception ex)
{
ExceptionManage.ExceptionHandle(ex);
}
return FullPath;
}
/// <summary>
/// 将生成的二维码保存到本地(暂时不用)
/// </summary>
/// <param name="img">将要保存的图片</param>
/// <param name="imgpath"></param>
private void saveQRCode(Image img,string imgpath)
{
if (!System.IO.Directory.Exists(imgpath))
{
Directory.CreateDirectory(imgpath);
}
string filename = string.Format(DateTime.Now.ToString(), "yyyymmddhhmmss");
filename = filename.Replace(" ", "");
filename = filename.Replace(":", "");
filename = filename.Replace("-", "");
filename = filename.Replace(".", "");
filename = filename.Replace("/", "");
img.Save(imgpath + filename + ".jpg");
}
/// <summary>
/// 调用此函数后使此两种图片合并,类似相册,有个
/// 背景图,中间贴自己的目标图片
/// </summary>
/// <param name="imgBack">粘贴的源图片</param>
/// <param name="destImg">粘贴的目标图片</param>
public Image CombinImage(Image imgBack, string destImg)
{
Image img = Image.FromFile(destImg); //照片图片
if (img.Height != 65 || img.Width != 65)
{
img = KiResizeImage(img, 65, 65, 0);
}
Graphics g = Graphics.FromImage(imgBack);
g.DrawImage(imgBack, 0, 0, imgBack.Width, imgBack.Height); //g.DrawImage(imgBack, 0, 0, 相框宽, 相框高);
//g.FillRectangle(System.Drawing.Brushes.White, imgBack.Width / 2 - img.Width / 2 - 1, imgBack.Width / 2 - img.Width / 2 - 1,1,1);//相片四周刷一层黑色边框
//g.DrawImage(img, 照片与相框的左边距, 照片与相框的上边距, 照片宽, 照片高);
g.DrawImage(img, imgBack.Width / 2 - img.Width / 2, imgBack.Width / 2 - img.Width / 2, img.Width, img.Height);
GC.Collect();
return imgBack;
}
/// <summary>
/// Resize图片
/// </summary>
/// <param name="bmp">原始Bitmap</param>
/// <param name="newW">新的宽度</param>
/// <param name="newH">新的高度</param>
/// <param name="Mode">保留着,暂时未用</param>
/// <returns>处理以后的图片</returns>
public Image KiResizeImage(Image bmp, int newW, int newH, int Mode)
{
try
{
Image b = new Bitmap(newW, newH);
Graphics g = Graphics.FromImage(b);
// 插值算法的质量
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
g.Dispose();
return b;
}
catch
{
return null;
}
}
#endregion
到此你就可以生成二维码了,支持汉字,中间自定义图片。
好像你对。。。。两小时后。。。。。
五瓶酒后,兴尽而归。。。。。。。。。。。
到此你就可以生成你所想要的二维码了,好像你也没有牛逼到死哈哈哈,
忘了我吧。。。。
C# 二维码生成支持汉字中间带图片相关推荐
- 二维码生成、扫描、图片识别(Zxing)
这样的例子虽然已经很多了,不过我在网上浏览了一圈,也没找到几个图库二维码图片识别例子,好的算法识别率才高.这里有一个好点的算法,算法不是我写的,只是作为整理记录,给众多安卓开发者一个方便.demo的U ...
- 微信小程序参数二维码生成朋友圈分享图片
前言 小程序目前无法分享到微信朋友圈,可朋友圈是一个非常重要的传播途径,所以得想办法把这个资源利用起来 微信小程序支持通过扫描/长按识别二维码或小程序码图片的方式进入一个小程序首页或小程序中某个特定页 ...
- vue二维码生成且带文字图片下载
(一)web页面效果: (二)执行结果: (三)vue代码实例: 1)安装qrcode-vue库:npm install --save qrcode-vue 2)安装html2canvas库:npm ...
- 一个炫酷的二维码生成项目附源码
前阵子打算换一个炫酷的公众号二维码,无奈市面上很多的二维码修改器都不尽人意. 草料二维码也挺炫酷的,但是也没有满意的效果. 于是又去万能的github逛了一下,终于找到了一款开源的二维码修改器. 这个 ...
- QT-C++二维码生成工具(支持中文等任何字符的使用)
QT-C++二维码生成工具 前言 1.效果预览 1.核心程序 全部程序 前言 QT/C++生成二维码程序,支持二维码图片本地保存功能. 1.效果预览 1.核心程序 如下: // 生成二维码图片QStr ...
- iOS二维码生成中间带图片Logo
iOS二维码生成中间带图片效果图: ViewController.h 1 #import <UIKit/UIKit.h> 2 @interface ViewController : UIV ...
- QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式...
QRCode 扫描二维码.扫描条形码.相册获取图片后识别.生成带 Logo 二维码.支持微博微信 QQ 二维码扫描样式 参考链接:https://github.com/bingoogolapple/B ...
- 生成二维码,支持中文
C# Code: /// <summary> /// 生成二维码,支持中文 /// </summary> /// <param name="data" ...
- 修改二维码生成插件jquery.qrcode.js支持加入自定义LOGO
1,将jquery.qrcode.min.js和jquery添加到您的网页中 <script src="jquery.min.js"></script> & ...
最新文章
- Windows DDK介绍,选择和安装
- android 拖动的view,Android实现随意拖动View效果
- 【深度学习】DIY 人脸识别技术的探索(二)
- 详解Google第二代TPU 既能推理又能训练 性能霸道
- Zxing二维码精简(竖屏、拉伸处理、扫描框大小和扫描线移动)
- Android开发之设置DialogFragment的窗体背景色的方法亲测可用
- HALCON 1D Measure 算子初识
- NET快速信息化系统开发框架 V3.2 -WinForm部分全部重构为Dev风格界面
- 开车请别玩手机、别弹吉他,MIT这套系统在盯着你!
- Linux环境下实现一个简单socket通信
- (二十二)用RANSAC算法来求线性回归模型的参数
- Office LTSC 2021 for Mac
- Resource is out of sync with the file system
- iOS非常全的第三方库
- 手把手带你快速实现直播聊天室
- 达梦数据库启动、停止,集群环境监视器服务启动、停止,查看各机器状态
- wps文件上的logo怎么去掉_PPT上LOGO怎么去掉怎么去除母版logo
- 帝国cms后台登录系统限制次数,60分钟过后重新登录解决办法
- postgresql 数据库 等保审计 遇到的问题与办法 (整理)
- SwiftUI——全局背景渐变色(Gradient)案例
热门文章
- Recovery for Dvr(WFS格式和大华监控恢复软件) V1.0软件简介
- wma转mp3怎么弄_如何使用在线转换器将MP3格式转换为wma格式
- 计算机主机温度,电脑温度太高,如何冷却电脑?
- 讯飞开放平台七夕福利
- java获取字符串长度_java中定义字符串String s=”pzhu”,下面操作可以取得字符串长度的是( )。...
- 人到中年,渡人先渡己
- redis缓存失效时间设为多少_Redis有效时间设置及时间过期处理
- 织梦邮件php,用PHP实现POP3邮件的解码(一)
- weui uploader java_微信小程序 WeUI·Uploader
- 厉害了!淘宝自动刷喵币!靠这一个脚本就够了!