C#生成带logo的二维码
带logo的二维码生成分为两步骤:首先根据输入的内容生成二维码图片,然后读取本地的logo图片,通过图片处理生成带logo的二维码。
生成的二维码效果如下:
下面直接贴出二维码生成类 QRCodeHelper.cs ,直接调用 CreateQRCodeWithLogo 方法,传入相应参数返回bitmap类型的数据,直接将返回的数据绑定到图片控件,如果是web可以先将图片保存到服务器指定地址在获取显示
- /// <summary>
- /// 生成带logo二维码
- /// </summary>
- public class QRCodeHelper
- {/// <summary>
- /// 创建二维码
- /// </summary>
- /// <param name="content"></param>
- /// <param name="size"></param>
- /// <returns></returns>
- public static Bitmap Create(string content)
- {
- try
- {
- //var options = new QrCodeEncodingOptions
- //{
- // DisableECI = true,
- // CharacterSet = "UTF-8",
- // Width = size,
- // Height = size,
- // Margin = 0,
- // ErrorCorrection = ErrorCorrectionLevel.H
- //};
- //var writer = new BarcodeWriter();
- //writer.Format = BarcodeFormat.QR_CODE;
- //writer.Options = options;
- //var bmp = writer.Write(content);
- //return bmp;
- QRCodeEncoder qRCodeEncoder = new QRCodeEncoder();
- qRCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//设置二维码编码格式
- qRCodeEncoder.QRCodeScale = ;//设置编码测量度
- qRCodeEncoder.QRCodeVersion = ;//设置编码版本
- qRCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//设置错误校验
- Bitmap image = qRCodeEncoder.Encode(content);
- return image;
- }
- catch (Exception ex)
- {
- return null;
- }
- }
- /// <summary>
- /// 获取本地图片
- /// </summary>
- /// <param name="fileName"></param>
- /// <returns></returns>
- private static Bitmap GetLocalLog(string fileName)
- {
- Bitmap newBmp = new Bitmap(fileName);
- //Bitmap bmp = new Bitmap(newBmp);
- return newBmp;
- }
- /// <summary>
- /// 生成带logo二维码
- /// </summary>
- /// <returns></returns>
- public static Bitmap CreateQRCodeWithLogo(string content, string logopath)
- {
- //生成二维码
- Bitmap qrcode = Create(content);
- //生成logo
- Bitmap logo = GetLocalLog(logopath);
- ImageUtility util = new ImageUtility();
- Bitmap finalImage = util.MergeQrImg(qrcode, logo);
- return finalImage;
- }
- }
下面是从网上找的图片处理类 ImageUtility.cs
- public class ImageUtility
- {
- #region 合并用户QR图片和用户头像
- /// <summary>
- /// 合并用户QR图片和用户头像
- /// </summary>
- /// <param name="qrImg">QR图片</param>
- /// <param name="headerImg">用户头像</param>
- /// <param name="n"></param>
- /// <returns></returns>
- public Bitmap MergeQrImg(Bitmap qrImg, Bitmap headerImg, double n = 0.23)
- {
- int margin = ;
- float dpix = qrImg.HorizontalResolution;
- float dpiy = qrImg.VerticalResolution;
- var _newWidth = ( * qrImg.Width - * margin) * 1.0f / ;
- var _headerImg = ZoomPic(headerImg, _newWidth / headerImg.Width);
- //处理头像
- int newImgWidth = _headerImg.Width + margin;
- Bitmap headerBgImg = new Bitmap(newImgWidth, newImgWidth);
- headerBgImg.MakeTransparent();
- Graphics g = Graphics.FromImage(headerBgImg);
- g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
- g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
- g.Clear(Color.Transparent);
- Pen p = new Pen(new SolidBrush(Color.White));
- Rectangle rect = new Rectangle(, , newImgWidth - , newImgWidth - );
- using (GraphicsPath path = CreateRoundedRectanglePath(rect, ))
- {
- g.DrawPath(p, path);
- g.FillPath(new SolidBrush(Color.White), path);
- }
- //画头像
- Bitmap img1 = new Bitmap(_headerImg.Width, _headerImg.Width);
- Graphics g1 = Graphics.FromImage(img1);
- g1.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
- g1.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
- g1.Clear(Color.Transparent);
- Pen p1 = new Pen(new SolidBrush(Color.Gray));
- Rectangle rect1 = new Rectangle(, , _headerImg.Width - , _headerImg.Width - );
- using (GraphicsPath path1 = CreateRoundedRectanglePath(rect1, ))
- {
- g1.DrawPath(p1, path1);
- TextureBrush brush = new TextureBrush(_headerImg);
- g1.FillPath(brush, path1);
- }
- g1.Dispose();
- PointF center = new PointF((newImgWidth - _headerImg.Width) / , (newImgWidth - _headerImg.Height) / );
- g.DrawImage(img1, center.X, center.Y, _headerImg.Width, _headerImg.Height);
- g.Dispose();
- Bitmap backgroudImg = new Bitmap(qrImg.Width, qrImg.Height);
- backgroudImg.MakeTransparent();
- backgroudImg.SetResolution(dpix, dpiy);
- headerBgImg.SetResolution(dpix, dpiy);
- Graphics g2 = Graphics.FromImage(backgroudImg);
- g2.Clear(Color.Transparent);
- g2.DrawImage(qrImg, , );
- PointF center2 = new PointF((qrImg.Width - headerBgImg.Width) / , (qrImg.Height - headerBgImg.Height) / );
- g2.DrawImage(headerBgImg, center2);
- g2.Dispose();
- return backgroudImg;
- }
- #endregion
- #region 图形处理
- /// <summary>
- /// 创建圆角矩形
- /// </summary>
- /// <param name="rect">区域</param>
- /// <param name="cornerRadius">圆角角度</param>
- /// <returns></returns>
- private GraphicsPath CreateRoundedRectanglePath(Rectangle rect, int cornerRadius)
- {
- //下午重新整理下,圆角矩形
- GraphicsPath roundedRect = new GraphicsPath();
- roundedRect.AddArc(rect.X, rect.Y, cornerRadius * , cornerRadius * , , );
- roundedRect.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * , rect.Y);
- roundedRect.AddArc(rect.X + rect.Width - cornerRadius * , rect.Y, cornerRadius * , cornerRadius * , , );
- roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * , rect.Right, rect.Y + rect.Height - cornerRadius * );
- roundedRect.AddArc(rect.X + rect.Width - cornerRadius * , rect.Y + rect.Height - cornerRadius * , cornerRadius * , cornerRadius * , , );
- roundedRect.AddLine(rect.Right - cornerRadius * , rect.Bottom, rect.X + cornerRadius * , rect.Bottom);
- roundedRect.AddArc(rect.X, rect.Bottom - cornerRadius * , cornerRadius * , cornerRadius * , , );
- roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * , rect.X, rect.Y + cornerRadius * );
- roundedRect.CloseFigure();
- return roundedRect;
- }
- /// <summary>
- /// 图片按比例缩放
- /// </summary>
- private Image ZoomPic(Image initImage, double n)
- {
- //缩略图宽、高计算
- double newWidth = initImage.Width;
- double newHeight = initImage.Height;
- newWidth = n * initImage.Width;
- newHeight = n * initImage.Height;
- //生成新图
- //新建一个bmp图片
- System.Drawing.Image newImage = new System.Drawing.Bitmap((int)newWidth, (int)newHeight);
- //新建一个画板
- System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage);
- //设置质量
- newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
- newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
- //置背景色
- newG.Clear(Color.Transparent);
- //画图
- newG.DrawImage(initImage, new System.Drawing.Rectangle(, , newImage.Width, newImage.Height), new System.Drawing.Rectangle(, , initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);
- newG.Dispose();
- return newImage;
- }
- /// <summary>
- /// 创建缩略图
- /// </summary>
- /// <param name="b"></param>
- /// <param name="destHeight"></param>
- /// <param name="destWidth"></param>
- /// <returns></returns>
- public static Bitmap GetThumbnail(Bitmap b, int destHeight, int destWidth)
- {
- System.Drawing.Image imgSource = b;
- System.Drawing.Imaging.ImageFormat thisFormat = imgSource.RawFormat;
- int sW = , sH = ;
- // 按比例缩放
- int sWidth = imgSource.Width;
- int sHeight = imgSource.Height;
- if (sHeight > destHeight || sWidth > destWidth)
- {
- if ((sWidth * destHeight) > (sHeight * destWidth))
- {
- sW = destWidth;
- sH = (destWidth * sHeight) / sWidth;
- }
- else
- {
- sH = destHeight;
- sW = (sWidth * destHeight) / sHeight;
- }
- }
- else
- {
- sW = sWidth;
- sH = sHeight;
- }
- Bitmap outBmp = new Bitmap(destWidth, destHeight);
- Graphics g = Graphics.FromImage(outBmp);
- g.Clear(Color.Transparent);
- // 设置画布的描绘质量
- g.CompositingQuality = CompositingQuality.HighQuality;
- g.SmoothingMode = SmoothingMode.HighQuality;
- g.InterpolationMode = InterpolationMode.HighQualityBicubic;
- g.DrawImage(imgSource, new Rectangle((destWidth - sW) / , (destHeight - sH) / , sW, sH), , , imgSource.Width, imgSource.Height, GraphicsUnit.Pixel);
- g.Dispose();
- // 以下代码为保存图片时,设置压缩质量
- EncoderParameters encoderParams = new EncoderParameters();
- long[] quality = new long[];
- quality[] = ;
- EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
- encoderParams.Param[] = encoderParam;
- imgSource.Dispose();
- return outBmp;
- }
- #endregion
- }
C#生成带logo的二维码的更多相关文章
- .NET生成带Logo的二维码
使用ThoughtWorks.QRCode生成,利用这个库来生成带Logo的二维码(就是中间嵌了一个图片的二维码),直接见代码: HttpContext context = HttpContext.C ...
- C# ZXing.Net生成二维码、识别二维码、生成带Logo的二维码(二)
1.使用ZXint.Net生成带logo的二维码 /// <summary> /// 生成带Logo的二维码 /// </summary> /// <param name ...
- 涛哥的Python脚本工具箱之生成带Logo的二维码
近期须要在二维码上加Logo,网上没有找到好用的,于是自己用python写了一个. 须要安装qrcode,PIL库 二维码简称 QR Code(Quick Response Code),学名为高速响应 ...
- phpqrcode生成带logo的二维码图片及带文字的二维码图片
<?php require_once "./phpqrcode/phpqrcode.php"; /** * 这样就可以生成二维码了,实际上在png这个方法里还有几个参数需要使 ...
- PHP生成带logo图像二维码的两种方法
本文主要和大家分享PHP生成带logo图像二维码的两种方法,主要以文字和代码的形式和大家分享,希望能帮助到大家. 一.利用Google API生成二维码Google提供了较为完善的二维码生成接口,调用 ...
- jQuery-qrcode.js 生成带Logo 的二维码
引入文件 jQuery-qrcode.js 地址:https://blog-static.cnblogs.com/files/kitty-blog/jquery-qrcode.js https:// ...
- JAVA生成带Logo的二维码
1.下载生成二维码所需要的jar包qrcode.jar: 2.直接上生成二维码的java代码 //需要导入的包 import java.awt.Color;import java.awt.Graphi ...
- 微信支付生成带logo的二维码
利用到一个qrcode类 比较简洁 原作者没有加入二维码嵌入logo的功能 在这里我进行了小小的修改 可以实现生成微信支付二维码时打上logo 生成png格式的利用到该类中的png方法(我已经改好了) ...
- js生成带logo的二维码
作为一名java程序员,一直以来都是使用服务端生成二维码,最近接触前端的设计,感觉二维码这块如果放到前端去生成,一方面可以减轻服务端的压力,访问带宽,另一方面,前端页面控制比较顺畅 闲话少叙,说下我的 ...
随机推荐
- 带你实现开发者头条APP(四)---首页优化(加入design包)
title: 带你实现开发者头条APP(四)---首页优化(加入design包) tags: design,Toolbar,TabLayout,RecyclerView grammar_cjkRuby ...
- Angular企业级开发(1)-AngularJS简介
AngularJS介绍 AngularJS是一个功能完善的JavaScript前端框架,同时是基于MVC(Model-View-Controller理念的框架,使用它能够高效的开发桌面web app和 ...
- 初探Vue
Vue.js(读音/vju:/,类似于view),是近来比较火的前端框架,但一直没有怎么具体了解.实现过,就知道个啥的MVVM啦,数据驱动啦,等这些关于Vue的虚概念. 由于最近,小生在公司中,负责开 ...
- 使用ubuntu作为web开发环境的一些感受
从ms-dos,win95,win98,winMe,winXp,vista,win7,win10我都有使用的经历,我使用时间最长的应属winxp,其次是win7,说实话,我觉得这两个系统是微软做的最好 ...
- $ORACLE_HOME变量值末尾多“/”惹的祸
之前一直误以为$ORACLE_HOME变量的路径中末尾多写一个"/"不会有影响. 今天做实验时碰到一个情景,发现并不是这样. 环境:OEL 5.7 + Oracle 10.2.0. ...
- UWP简单示例(三):快速开发2D游戏引擎
准备 IDE:VisualStudio 2015 Language:VB.NET/C# 图形API:Win2D MSDN教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面 ...
- Android 工具-adb
Android 工具-adb 版权声明:本文为博主原创文章,未经博主允许不得转载. Android 开发中, adb 是开发者经常使用的工具,是 Android 开发者必须掌握的. Android D ...
- JAVA 设计模式之策略模式
定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...
- 使用C#给Linux写Shell脚本
在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...
- Mac-OSX的Python3.5虚拟环境下安装Opencv
Mac-OSX的Python3.5虚拟环境下安装Opencv 1 关键词 关键词:Mac,OSX,Python3.5,Virtualenv,Opencv 2 概述 本文是一篇 环境搭建 的基础 ...