c# 生成与解码二维码,自定义中心图片与边框
2017-07-21 15:10
465 查看
c# 的二维码 需借助插件ThoughtWorks
直接引用
using ThoughtWorks.QRCode.Codec; 需下载dll
using ThoughtWorks.QRCode.Codec.Data;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
//生成二维码方法1
![](http://images2015.cnblogs.com/blog/1165148/201707/1165148-20170720193323786-1846543166.jpg)
///
/// 生成二维码 本函数摘录自网友的方法,后面重写了一个
///
/// 内容文本
/// 二维码编码方式
/// 纠错码等级
/// 二维码版本号 0-40
/// 每个小方格的预设宽度(像素),正整数
/// 图片尺寸(像素),0表示不设置
/// 图片白边(像素),当size大于0时有效
///
public static System.Drawing.Image CreateQRCode(string Content, QRCodeEncoder.ENCODE_MODE QRCodeEncodeMode, QRCodeEncoder.ERROR_CORRECTION QRCodeErrorCorrect, int QRCodeVersion, int QRCodeScale, int size, int border)
{
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncodeMode;
qrCodeEncoder.QRCodeErrorCorrect = QRCodeErrorCorrect;
qrCodeEncoder.QRCodeScale = QRCodeScale;
qrCodeEncoder.QRCodeVersion = QRCodeVersion;
System.Drawing.Image image = qrCodeEncoder.Encode(Content);
//二维码解码
///
/// 二维码解码
///
/// 图片路径
///
public string CodeDecoder(string filePath)
{
if (!System.IO.File.Exists(filePath))
return null;
Bitmap myBitmap = new Bitmap(Image.FromFile(filePath));
QRCodeDecoder decoder = new QRCodeDecoder();
string decodedString = decoder.decode(new QRCodeBitmapImage(myBitmap));
return decodedString;
}
图片地址:http://imgsrc.baidu.com/image/c0%3Dshijue1%2C0%2C0%2C294%2C40/sign=729f32ebc9cec3fd9f33af36bee1be4a/fd039245d688d43f4c195ed5771ed21b0ef43b61.jpg
例子:http://192.168.2.228/api/Counselor/GetCodeImg?text=sb&imgurl=http://imgsrc.baidu.com/image/c0%3Dshijue1%2C0%2C0%2C294%2C40/sign=729f32ebc9cec3fd9f33af36bee1be4a/fd039245d688d43f4c195ed5771ed21b0ef43b61.jpg
调用api 生成图片如下
c# 生成与解码二维码,自定义中心图片与边框
c# 的二维码 需借助插件ThoughtWorks
直接引用
using ThoughtWorks.QRCode.Codec;
using ThoughtWorks.QRCode.Codec.Data;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
//二维码解码
///
/// 二维码解码
///
/// 图片路径
///
public string CodeDecoder(string filePath)
{
if (!System.IO.File.Exists(filePath))
return null;
Bitmap myBitmap = new Bitmap(Image.FromFile(filePath));
QRCodeDecoder decoder = new QRCodeDecoder();
string decodedString = decoder.decode(new QRCodeBitmapImage(myBitmap));
return decodedString;
}
图片地址:http://imgsrc.baidu.com/image/c0%3Dshijue1%2C0%2C0%2C294%2C40/sign=729f32ebc9cec3fd9f33af36bee1be4a/fd039245d688d43f4c195ed5771ed21b0ef43b61.jpg
例子:http://192.168.2.228/api/Counselor/GetCodeImg?text=sb&imgurl=http://imgsrc.baidu.com/image/c0%3Dshijue1%2C0%2C0%2C294%2C40/sign=729f32ebc9cec3fd9f33af36bee1be4a/fd039245d688d43f4c195ed5771ed21b0ef43b61.jpg
调用api 生成图片如下
![](http://images2015.cnblogs.com/blog/1165148/201707/1165148-20170720194305536-1544539911.png)
扫码即可得出text的内容
直接引用
using ThoughtWorks.QRCode.Codec; 需下载dll
using ThoughtWorks.QRCode.Codec.Data;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
//生成二维码方法1
//text 二维码的文本内容 //Counselor对象内含微信头像等信息 public static string GetTwoCodeMetho(string text, bk_Counselor Counselor) { String data = text; string url = ""; if (!string.IsNullOrEmpty(data)) { //声明QRCodeEncoder 其属性在下面的详细方法中有解释 QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(); qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE; qrCodeEncoder.QRCodeScale = 4; qrCodeEncoder.QRCodeVersion = 8; qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M; Image image = CreateQRCode(data, QRCodeEncoder.ENCODE_MODE.BYTE, QRCodeEncoder.ERROR_CORRECTION.M, 8, 4, 0, 5); //System.Drawing.Image image = qrCodeEncoder.Encode(data); System.IO.MemoryStream MStream = new System.IO.MemoryStream(); image.Save(MStream, System.Drawing.Imaging.ImageFormat.Png); System.IO.MemoryStream MStream1 = new System.IO.MemoryStream(); System.Drawing.Image codeimg; //有微信头像地址 if (!string.IsNullOrEmpty(Counselor.CounselorImg)) { System.Net.WebRequest webreq = System.Net.WebRequest.Create(Counselor.CounselorImg); System.Net.WebResponse webres = webreq.GetResponse(); Stream stream = webres.GetResponseStream(); Image ImageWeixin; ImageWeixin = Image.FromStream(stream); stream.Close(); codeimg = CombinImage(image, ImageWeixin); codeimg.Save(MStream1, System.Drawing.Imaging.ImageFormat.Png); } else { codeimg = image; } //保存图片到本地 string PortraitApp = "~/FileLibs/CodeImg/"; if (!Directory.Exists(HttpContext.Current.Server.MapPath(PortraitApp))) { Directory.CreateDirectory(HttpContext.Current.Server.MapPath(PortraitApp)); } string filename = Counselor.CounselorName + DateTime.Now.ToString("yyyymmddhhmmssfff").ToString() + ".png"; string filepath = HttpContext.Current.Server.MapPath(PortraitApp) + "\\" + filename; System.IO.FileStream fs = new System.IO.FileStream(filepath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write); codeimg.Save(fs, System.Drawing.Imaging.ImageFormat.Png); //由于项目前后台分离 需要指定生成二维码后的url string RetureFile = System.Configuration.ConfigurationManager.AppSettings["RetureFile"].ToString(); url = RetureFile.Replace("/FileLibs/File/", "/FileLibs/CodeImg/") + filename; //HttpContext.Current.Response.ClearContent(); //HttpContext.Current.Response.ContentType = "image/png"; //HttpContext.Current.Response.BinaryWrite(MStream1.ToArray());//直接输出图片 测试用 //处理完释放资源 //image.Dispose(); MStream.Dispose(); MStream1.Dispose(); } return url; //HttpContext.Current.Response.Flush(); //HttpContext.Current.Response.End(); } 测试 效果图如下:
![](http://images2015.cnblogs.com/blog/1165148/201707/1165148-20170720193323786-1846543166.jpg)
///
/// 生成二维码 本函数摘录自网友的方法,后面重写了一个
///
/// 内容文本
/// 二维码编码方式
/// 纠错码等级
/// 二维码版本号 0-40
/// 每个小方格的预设宽度(像素),正整数
/// 图片尺寸(像素),0表示不设置
/// 图片白边(像素),当size大于0时有效
///
public static System.Drawing.Image CreateQRCode(string Content, QRCodeEncoder.ENCODE_MODE QRCodeEncodeMode, QRCodeEncoder.ERROR_CORRECTION QRCodeErrorCorrect, int QRCodeVersion, int QRCodeScale, int size, int border)
{
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncodeMode;
qrCodeEncoder.QRCodeErrorCorrect = QRCodeErrorCorrect;
qrCodeEncoder.QRCodeScale = QRCodeScale;
qrCodeEncoder.QRCodeVersion = QRCodeVersion;
System.Drawing.Image image = qrCodeEncoder.Encode(Content);
#region 根据设定的目标图片尺寸调整二维码QRCodeScale设置,并添加边框 if (size > 0) { //当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸 #region 当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸 while (image.Width < size) { qrCodeEncoder.QRCodeScale++; System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content); if (imageNew.Width < size) { image = new System.Drawing.Bitmap(imageNew); imageNew.Dispose(); imageNew = null; } else { qrCodeEncoder.QRCodeScale--; //新尺寸未采用,恢复最终使用的尺寸 imageNew.Dispose(); imageNew = null; break; } } #endregion //当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸 #region 当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸 while (image.Width > size && qrCodeEncoder.QRCodeScale > 1) { qrCodeEncoder.QRCodeScale--; System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content); image = new System.Drawing.Bitmap(imageNew); imageNew.Dispose(); imageNew = null; if (image.Width < size) { break; } } #endregion //如果目标尺寸大于生成的图片尺寸,则为图片增加白边 #region 如果目标尺寸大于生成的图片尺寸,则为图片增加白边 if (image.Width <= size) { //根据参数设置二维码图片白边的最小宽度 #region 根据参数设置二维码图片白边的最小宽度 if (border > 0) { while (image.Width <= size && size - image.Width < border * 2 && qrCodeEncoder.QRCodeScale > 1) { qrCodeEncoder.QRCodeScale--; System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content); image = new System.Drawing.Bitmap(imageNew); imageNew.Dispose(); imageNew = null; } } #endregion //当目标图片尺寸大于二维码尺寸时,将二维码绘制在目标尺寸白色画布的中心位置 if (image.Width < size) { //新建空白绘图 System.Drawing.Bitmap panel = new System.Drawing.Bitmap(size, size); System.Drawing.Graphics graphic0 = System.Drawing.Graphics.FromImage(panel); int p_left = 0; int p_top = 0; if (image.Width <= size) //如果原图比目标形状宽 { p_left = (size - image.Width) / 2; } if (image.Height <= size) { p_top = (size - image.Height) / 2; } //将生成的二维码图像粘贴至绘图的中心位置 graphic0.DrawImage(image, p_left, p_top, image.Width, image.Height); image = new System.Drawing.Bitmap(panel); panel.Dispose(); panel = null; graphic0.Dispose(); graphic0 = null; } } #endregion } #endregion return image; } //生成二维码方法3 text为文本或网址等内容,imgurl则为图片的网址 public static void GetTwoCodeMethoThree(string text, string imgurl = "") { try { String data = text; if (!string.IsNullOrEmpty(data)) { QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(); qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//编码方式:BYTE 能支持中文,ALPHA_NUMERIC 扫描出来的都是数 qrCodeEncoder.QRCodeScale = 4;//大小:值越大生成的二维码图片像素越高 qrCodeEncoder.QRCodeVersion = 8;//版本 qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//错误校验、更正等级 Image image = CreateQRCode(text, QRCodeEncoder.ENCODE_MODE.BYTE, QRCodeEncoder.ERROR_CORRECTION.M, 8, 4, 0, 5); //System.Drawing.Image image = qrCodeEncoder.Encode(data); System.IO.MemoryStream MStream = new System.IO.MemoryStream(); image.Save(MStream, System.Drawing.Imaging.ImageFormat.Png); System.IO.MemoryStream MStream1 = new System.IO.MemoryStream(); System.Drawing.Image codeimg; Image ImageWeixin; if (!string.IsNullOrEmpty(imgurl)) { try { //获得网络上的图片 System.Net.WebRequest webreq = System.Net.WebRequest.Create(imgurl); System.Net.WebResponse webres = webreq.GetResponse(); Stream stream = webres.GetResponseStream(); ImageWeixin = Image.FromStream(stream); stream.Close(); //贴图 codeimg = CombinImage(image, ImageWeixin); codeimg.Save(MStream1, System.Drawing.Imaging.ImageFormat.Png); } catch { } } //codeimg.Save(MStream1, System.Drawing.Imaging.ImageFormat.Png); //string filename = text + DateTime.Now.ToString("yyyymmddhhmmssfff").ToString() + ".png"; //string filepath = HttpContext.Current.Server.MapPath(PortraitApp) + "\\" + filename; //System.IO.FileStream fs = new System.IO.FileStream(filepath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write); //codeimg.Save(fs, System.Drawing.Imaging.ImageFormat.Png); //string RetureFile = System.Configuration.ConfigurationManager.AppSettings["RetureFile"].ToString(); //直接输出图片 不保存 HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ContentType = "image/png"; HttpContext.Current.Response.BinaryWrite(MStream1.ToArray()); image.Dispose(); MStream.Dispose(); MStream1.Dispose(); } HttpContext.Current.Response.Flush(); HttpContext.Current.Response.End(); //return url; } catch (Exception ex) { HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ContentType = "text/xml"; HttpContext.Current.Response.Write("操作异常:" + ex.ToString()); HttpContext.Current.Response.Flush(); HttpContext.Current.Response.End(); } } /// <summary> /// 调用此函数后使此两种图片合并,类似相册,有个 /// 背景图,中间贴自己的目标图片,注意参数不同 destImg使用的是已经初始化的Image,可用于网址类的图片 /// </summary> /// <param name="imgBack">粘贴的源图片</param> /// <param name="destImg">粘贴的目标图片</param> public static Image CombinImage(Image imgBack, Image destImg, int Lenth = 40) { Image img = destImg; //照片图片 if (img.Height != Lenth || img.Width != Lenth) { img = KiResizeImage(img, Lenth, Lenth, 0); //圆角处理 此处后来优化后调用一次就可以了 img = CreateRoundedCorner(img, "", "TopLeft"); img = CreateRoundedCorner(img, "", "TopRight"); img = CreateRoundedCorner(img, "", "BottomLeft"); img = CreateRoundedCorner(img, "", "BottomRight"); } Graphics g = Graphics.FromImage(imgBack); g.DrawImage(imgBack, 0, 0, imgBack.Width + 5, imgBack.Height + 5); //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> /// 调用此函数后使此两种图片合并,类似相册,有个 /// 背景图,中间贴自己的目标图片 参数不同,destImg使用的是本地路径 /// </summary> /// <param name="imgBack">粘贴的源图片</param> /// <param name="destImg">粘贴的目标图片</param> public static Image CombinImage(Image imgBack, string destImg) { Image img = Image.FromFile(destImg); //照片图片 if (img.Height != 65 || img.Width != 65) { img = KiResizeImage(img, 45, 45, 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; } //创建图层圆角 public static Image CreateRoundedCorner(Image image, string sDstFilePath, string sCornerLocation) { Graphics g = Graphics.FromImage(image); g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.CompositingQuality = CompositingQuality.HighQuality; Rectangle rect = new Rectangle(0, 0, image.Width, image.Height); GraphicsPath rectPath = CreateRoundRectanglePath(rect, image.Width / 10, sCornerLocation); //构建圆角外部路径 Brush b = new SolidBrush(Color.White);//圆角背景白色 g.DrawPath(new Pen(b), rectPath); g.FillPath(b, rectPath); g.Dispose(); //image.Save(sDstFilePath, ImageFormat.Png); return image; //image.Dispose(); } //处理圆角 上下左右 private static GraphicsPath CreateRoundRectanglePath(Rectangle rect, int radius, string sPosition) { GraphicsPath rectPath = new GraphicsPath(); switch (sPosition) { case "TopLeft": { rectPath.AddArc(rect.Left, rect.Top, radius * 2, radius * 2, 180, 90); rectPath.AddLine(rect.Left, rect.Top, rect.Left, rect.Top + radius); break; } case "TopRight": { rectPath.AddArc(rect.Right - radius * 2, rect.Top, radius * 2, radius * 2, 270, 90); rectPath.AddLine(rect.Right, rect.Top, rect.Right - radius, rect.Top); break; } case "BottomLeft": { rectPath.AddArc(rect.Left, rect.Bottom - radius * 2, radius * 2, radius * 2, 90, 90); rectPath.AddLine(rect.Left, rect.Bottom - radius, rect.Left, rect.Bottom); break; } case "BottomRight": { rectPath.AddArc(rect.Right - radius * 2, rect.Bottom - radius * 2, radius * 2, radius * 2, 0, 90); rectPath.AddLine(rect.Right - radius, rect.Bottom, rect.Right, rect.Bottom); break; } } return rectPath; } /// <summary> /// Resize图片 裁剪 /// </summary> /// <param name="bmp">原始Bitmap</param> /// <param name="newW">新的宽度</param> /// <param name="newH">新的高度</param> /// <param name="Mode">保留着,暂时未用</param> /// <returns>处理以后的图片</returns> public static 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; } }
//二维码解码
///
/// 二维码解码
///
/// 图片路径
///
public string CodeDecoder(string filePath)
{
if (!System.IO.File.Exists(filePath))
return null;
Bitmap myBitmap = new Bitmap(Image.FromFile(filePath));
QRCodeDecoder decoder = new QRCodeDecoder();
string decodedString = decoder.decode(new QRCodeBitmapImage(myBitmap));
return decodedString;
}
图片地址:http://imgsrc.baidu.com/image/c0%3Dshijue1%2C0%2C0%2C294%2C40/sign=729f32ebc9cec3fd9f33af36bee1be4a/fd039245d688d43f4c195ed5771ed21b0ef43b61.jpg
例子:http://192.168.2.228/api/Counselor/GetCodeImg?text=sb&imgurl=http://imgsrc.baidu.com/image/c0%3Dshijue1%2C0%2C0%2C294%2C40/sign=729f32ebc9cec3fd9f33af36bee1be4a/fd039245d688d43f4c195ed5771ed21b0ef43b61.jpg
调用api 生成图片如下
c# 生成与解码二维码,自定义中心图片与边框
c# 的二维码 需借助插件ThoughtWorks
直接引用
using ThoughtWorks.QRCode.Codec;
using ThoughtWorks.QRCode.Codec.Data;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
//生成二维码方法1 //text 二维码的文本内容 //Counselor对象内含微信头像等信息 public static string GetTwoCodeMetho(string text, bk_Counselor Counselor) { String data = text; string url = ""; if (!string.IsNullOrEmpty(data)) { //声明QRCodeEncoder 其属性在下面的详细方法中有解释 QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(); qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE; qrCodeEncoder.QRCodeScale = 4; qrCodeEncoder.QRCodeVersion = 8; qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M; Image image = CreateQRCode(data, QRCodeEncoder.ENCODE_MODE.BYTE, QRCodeEncoder.ERROR_CORRECTION.M, 8, 4, 0, 5); //System.Drawing.Image image = qrCodeEncoder.Encode(data); System.IO.MemoryStream MStream = new System.IO.MemoryStream(); image.Save(MStream, System.Drawing.Imaging.ImageFormat.Png); System.IO.MemoryStream MStream1 = new System.IO.MemoryStream(); System.Drawing.Image codeimg; //有微信头像地址 if (!string.IsNullOrEmpty(Counselor.CounselorImg)) { System.Net.WebRequest webreq = System.Net.WebRequest.Create(Counselor.CounselorImg); System.Net.WebResponse webres = webreq.GetResponse(); Stream stream = webres.GetResponseStream(); Image ImageWeixin; ImageWeixin = Image.FromStream(stream); stream.Close(); codeimg = CombinImage(image, ImageWeixin); codeimg.Save(MStream1, System.Drawing.Imaging.ImageFormat.Png); } else { codeimg = image; } //保存图片到本地 string PortraitApp = "~/FileLibs/CodeImg/"; if (!Directory.Exists(HttpContext.Current.Server.MapPath(PortraitApp))) { Directory.CreateDirectory(HttpContext.Current.Server.MapPath(PortraitApp)); } string filename = Counselor.CounselorName + DateTime.Now.ToString("yyyymmddhhmmssfff").ToString() + ".png"; string filepath = HttpContext.Current.Server.MapPath(PortraitApp) + "\\" + filename; System.IO.FileStream fs = new System.IO.FileStream(filepath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write); codeimg.Save(fs, System.Drawing.Imaging.ImageFormat.Png); //由于项目前后台分离 需要指定生成二维码后的url string RetureFile = System.Configuration.ConfigurationManager.AppSettings["RetureFile"].ToString(); url = RetureFile.Replace("/FileLibs/File/", "/FileLibs/CodeImg/") + filename; //HttpContext.Current.Response.ClearContent(); //HttpContext.Current.Response.ContentType = "image/png"; //HttpContext.Current.Response.BinaryWrite(MStream1.ToArray());//直接输出图片 测试用 //处理完释放资源 //image.Dispose(); MStream.Dispose(); MStream1.Dispose(); } return url; //HttpContext.Current.Response.Flush(); //HttpContext.Current.Response.End(); } 测试 效果图如下: /// <summary> /// 生成二维码 本函数摘录自网友的方法,后面重写了一个 /// </summary> /// <param name="Content">内容文本</param> /// <param name="QRCodeEncodeMode">二维码编码方式</param> /// <param name="QRCodeErrorCorrect">纠错码等级</param> /// <param name="QRCodeVersion">二维码版本号 0-40</param> /// <param name="QRCodeScale">每个小方格的预设宽度(像素),正整数</param> /// <param name="size">图片尺寸(像素),0表示不设置</param> /// <param name="border">图片白边(像素),当size大于0时有效</param> /// <returns></returns> public static System.Drawing.Image CreateQRCode(string Content, QRCodeEncoder.ENCODE_MODE QRCodeEncodeMode, QRCodeEncoder.ERROR_CORRECTION QRCodeErrorCorrect, int QRCodeVersion, int QRCodeScale, int size, int border) { QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(); qrCodeEncoder.QRCodeEncodeMode = QRCodeEncodeMode; qrCodeEncoder.QRCodeErrorCorrect = QRCodeErrorCorrect; qrCodeEncoder.QRCodeScale = QRCodeScale; qrCodeEncoder.QRCodeVersion = QRCodeVersion; System.Drawing.Image image = qrCodeEncoder.Encode(Content); #region 根据设定的目标图片尺寸调整二维码QRCodeScale设置,并添加边框 if (size > 0) { //当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸 #region 当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸 while (image.Width < size) { qrCodeEncoder.QRCodeScale++; System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content); if (imageNew.Width < size) { image = new System.Drawing.Bitmap(imageNew); imageNew.Dispose(); imageNew = null; } else { qrCodeEncoder.QRCodeScale--; //新尺寸未采用,恢复最终使用的尺寸 imageNew.Dispose(); imageNew = null; break; } } #endregion //当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸 #region 当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸 while (image.Width > size && qrCodeEncoder.QRCodeScale > 1) { qrCodeEncoder.QRCodeScale--; System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content); image = new System.Drawing.Bitmap(imageNew); imageNew.Dispose(); imageNew = null; if (image.Width < size) { break; } } #endregion //如果目标尺寸大于生成的图片尺寸,则为图片增加白边 #region 如果目标尺寸大于生成的图片尺寸,则为图片增加白边 if (image.Width <= size) { //根据参数设置二维码图片白边的最小宽度 #region 根据参数设置二维码图片白边的最小宽度 if (border > 0) { while (image.Width <= size && size - image.Width < border * 2 && qrCodeEncoder.QRCodeScale > 1) { qrCodeEncoder.QRCodeScale--; System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content); image = new System.Drawing.Bitmap(imageNew); imageNew.Dispose(); imageNew = null; } } #endregion //当目标图片尺寸大于二维码尺寸时,将二维码绘制在目标尺寸白色画布的中心位置 if (image.Width < size) { //新建空白绘图 System.Drawing.Bitmap panel = new System.Drawing.Bitmap(size, size); System.Drawing.Graphics graphic0 = System.Drawing.Graphics.FromImage(panel); int p_left = 0; int p_top = 0; if (image.Width <= size) //如果原图比目标形状宽 { p_left = (size - image.Width) / 2; } if (image.Height <= size) { p_top = (size - image.Height) / 2; } //将生成的二维码图像粘贴至绘图的中心位置 graphic0.DrawImage(image, p_left, p_top, image.Width, image.Height); image = new System.Drawing.Bitmap(panel); panel.Dispose(); panel = null; graphic0.Dispose(); graphic0 = null; } } #endregion } #endregion return image; } //生成二维码方法3 text为文本或网址等内容,imgurl则为图片的网址 public static void GetTwoCodeMethoThree(string text, string imgurl = "") { try { String data = text; if (!string.IsNullOrEmpty(data)) { QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(); qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//编码方式:BYTE 能支持中文,ALPHA_NUMERIC 扫描出来的都是数 qrCodeEncoder.QRCodeScale = 4;//大小:值越大生成的二维码图片像素越高 qrCodeEncoder.QRCodeVersion = 8;//版本 qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//错误校验、更正等级 Image image = CreateQRCode(text, QRCodeEncoder.ENCODE_MODE.BYTE, QRCodeEncoder.ERROR_CORRECTION.M, 8, 4, 0, 5); //System.Drawing.Image image = qrCodeEncoder.Encode(data); System.IO.MemoryStream MStream = new System.IO.MemoryStream(); image.Save(MStream, System.Drawing.Imaging.ImageFormat.Png); System.IO.MemoryStream MStream1 = new System.IO.MemoryStream(); System.Drawing.Image codeimg; Image ImageWeixin; if (!string.IsNullOrEmpty(imgurl)) { try { //获得网络上的图片 System.Net.WebRequest webreq = System.Net.WebRequest.Create(imgurl); System.Net.WebResponse webres = webreq.GetResponse(); Stream stream = webres.GetResponseStream(); ImageWeixin = Image.FromStream(stream); stream.Close(); //贴图 codeimg = CombinImage(image, ImageWeixin); codeimg.Save(MStream1, System.Drawing.Imaging.ImageFormat.Png); } catch { } } //codeimg.Save(MStream1, System.Drawing.Imaging.ImageFormat.Png); //string filename = text + DateTime.Now.ToString("yyyymmddhhmmssfff").ToString() + ".png"; //string filepath = HttpContext.Current.Server.MapPath(PortraitApp) + "\\" + filename; //System.IO.FileStream fs = new System.IO.FileStream(filepath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write); //codeimg.Save(fs, System.Drawing.Imaging.ImageFormat.Png); //string RetureFile = System.Configuration.ConfigurationManager.AppSettings["RetureFile"].ToString(); //直接输出图片 不保存 HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ContentType = "image/png"; HttpContext.Current.Response.BinaryWrite(MStream1.ToArray()); image.Dispose(); MStream.Dispose(); MStream1.Dispose(); } HttpContext.Current.Response.Flush(); HttpContext.Current.Response.End(); //return url; } catch (Exception ex) { HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ContentType = "text/xml"; HttpContext.Current.Response.Write("操作异常:" + ex.ToString()); HttpContext.Current.Response.Flush(); HttpContext.Current.Response.End(); } } /// <summary> /// 调用此函数后使此两种图片合并,类似相册,有个 /// 背景图,中间贴自己的目标图片,注意参数不同 destImg使用的是已经初始化的Image,可用于网址类的图片 /// </summary> /// <param name="imgBack">粘贴的源图片</param> /// <param name="destImg">粘贴的目标图片</param> public static Image CombinImage(Image imgBack, Image destImg, int Lenth = 40) { Image img = destImg; //照片图片 if (img.Height != Lenth || img.Width != Lenth) { img = KiResizeImage(img, Lenth, Lenth, 0); //圆角处理 此处后来优化后调用一次就可以了 img = CreateRoundedCorner(img, "", "TopLeft"); img = CreateRoundedCorner(img, "", "TopRight"); img = CreateRoundedCorner(img, "", "BottomLeft"); img = CreateRoundedCorner(img, "", "BottomRight"); } Graphics g = Graphics.FromImage(imgBack); g.DrawImage(imgBack, 0, 0, imgBack.Width + 5, imgBack.Height + 5); //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> /// 调用此函数后使此两种图片合并,类似相册,有个 /// 背景图,中间贴自己的目标图片 参数不同,destImg使用的是本地路径 /// </summary> /// <param name="imgBack">粘贴的源图片</param> /// <param name="destImg">粘贴的目标图片</param> public static Image CombinImage(Image imgBack, string destImg) { Image img = Image.FromFile(destImg); //照片图片 if (img.Height != 65 || img.Width != 65) { img = KiResizeImage(img, 45, 45, 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; } //创建图层圆角 public static Image CreateRoundedCorner(Image image, string sDstFilePath, string sCornerLocation) { Graphics g = Graphics.FromImage(image); g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.CompositingQuality = CompositingQuality.HighQuality; Rectangle rect = new Rectangle(0, 0, image.Width, image.Height); GraphicsPath rectPath = CreateRoundRectanglePath(rect, image.Width / 10, sCornerLocation); //构建圆角外部路径 Brush b = new SolidBrush(Color.White);//圆角背景白色 g.DrawPath(new Pen(b), rectPath); g.FillPath(b, rectPath); g.Dispose(); //image.Save(sDstFilePath, ImageFormat.Png); return image; //image.Dispose(); } //处理圆角 上下左右 private static GraphicsPath CreateRoundRectanglePath(Rectangle rect, int radius, string sPosition) { GraphicsPath rectPath = new GraphicsPath(); switch (sPosition) { case "TopLeft": { rectPath.AddArc(rect.Left, rect.Top, radius * 2, radius * 2, 180, 90); rectPath.AddLine(rect.Left, rect.Top, rect.Left, rect.Top + radius); break; } case "TopRight": { rectPath.AddArc(rect.Right - radius * 2, rect.Top, radius * 2, radius * 2, 270, 90); rectPath.AddLine(rect.Right, rect.Top, rect.Right - radius, rect.Top); break; } case "BottomLeft": { rectPath.AddArc(rect.Left, rect.Bottom - radius * 2, radius * 2, radius * 2, 90, 90); rectPath.AddLine(rect.Left, rect.Bottom - radius, rect.Left, rect.Bottom); break; } case "BottomRight": { rectPath.AddArc(rect.Right - radius * 2, rect.Bottom - radius * 2, radius * 2, radius * 2, 0, 90); rectPath.AddLine(rect.Right - radius, rect.Bottom, rect.Right, rect.Bottom); break; } } return rectPath; } /// <summary> /// Resize图片 裁剪 /// </summary> /// <param name="bmp">原始Bitmap</param> /// <param name="newW">新的宽度</param> /// <param name="newH">新的高度</param> /// <param name="Mode">保留着,暂时未用</param> /// <returns>处理以后的图片</returns> public static 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; } }
//二维码解码
///
/// 二维码解码
///
/// 图片路径
///
public string CodeDecoder(string filePath)
{
if (!System.IO.File.Exists(filePath))
return null;
Bitmap myBitmap = new Bitmap(Image.FromFile(filePath));
QRCodeDecoder decoder = new QRCodeDecoder();
string decodedString = decoder.decode(new QRCodeBitmapImage(myBitmap));
return decodedString;
}
图片地址:http://imgsrc.baidu.com/image/c0%3Dshijue1%2C0%2C0%2C294%2C40/sign=729f32ebc9cec3fd9f33af36bee1be4a/fd039245d688d43f4c195ed5771ed21b0ef43b61.jpg
例子:http://192.168.2.228/api/Counselor/GetCodeImg?text=sb&imgurl=http://imgsrc.baidu.com/image/c0%3Dshijue1%2C0%2C0%2C294%2C40/sign=729f32ebc9cec3fd9f33af36bee1be4a/fd039245d688d43f4c195ed5771ed21b0ef43b61.jpg
调用api 生成图片如下
![](http://images2015.cnblogs.com/blog/1165148/201707/1165148-20170720194305536-1544539911.png)
扫码即可得出text的内容
相关文章推荐
- asp.net(C#)利用QRCode生成二维码(续)-在二维码图片中心加Logo或图像
- asp.net(C#)利用QRCode生成二维码(续)-在二维码图片中心加Logo或图像
- asp.net(C#)利用QRCode生成二维码(续)-在二维码图片中心加Logo或图像
- C# QRCode 二维码生成 or 在二维码图片中心加Logo或图像
- asp.net(C#)利用QRCode生成二维码(续)-在二维码图片中心加Logo或图像
- asp.net(C#)使用QRCode生成图片中心加Logo或图像的二维码实例
- asp.net(C#)利用QRCode生成二维码(续)-在二维码图片中心加Logo或图像 .
- asp.net(C#)利用QRCode生成二维码(续)-在二维码图片中心加Logo或图像
- C#利用QRCode动态生成自定义二维码图片
- [java]生成带logo图片的二维码、以及二维码解码
- 友盟自定义分享-生成带图片的二维码,自定义分享布局
- ZXing.Net生成二维码和解码二维码图像 C#
- C# Qrcode生成二维码支持中文,带图片,带文字
- C# 利用QRCode生成二维码图片
- C#Qrcode生成二维码支持中文,带图片,带文字
- c# 生成二维码图片
- c# 使用ThoughtWorks.QRCode.dll生成二维码图片
- 基于ZXing Android实现生成二维码图片和相机扫描二维码图片即时解码的功能
- C# 利用QRCode生成二维码图片