C# 生成二维码并且在中间加Logo

今天做项目的时候有个在生成二维码并且在中间加入Logo的需求,动手试了几把,总感觉效果没有之前写的好,就翻出旧代码,果然还是熟悉的味道,生成一张效果图如下

左边是微信里面的,右边是我自己生成的

     

原理比较简单,但细节还是有些复杂,废话不多说直接上代码

public class QRCodeHelper 
{ 
public static Bitmap GetThumbnail(Bitmap b, int destHeight, int destWidth) 
{ 
System.Drawing.Image imgSource = b; 
System.Drawing.Imaging.ImageFormat thisFormat = imgSource.RawFormat; 
int sW = 0, sH = 0; 
// 按比例缩放  
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) / 2, (destHeight - sH) / 2, sW, sH), 0, 0, imgSource.Width, imgSource.Height, GraphicsUnit.Pixel); 
g.Dispose(); 
// 以下代码为保存图片时,设置压缩质量  
EncoderParameters encoderParams = new EncoderParameters(); 
long[] quality = new long[1]; 
quality[0] = 100; 
EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality); 
encoderParams.Param[0] = encoderParam; 
imgSource.Dispose(); 
return outBmp; 
} 
public static Bitmap Create(string content, int size) 
{ 
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; 
} 
catch (Exception ex) 
{ 
return null; 
} 
} 
} 
  
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 = 10; 
float dpix = qrImg.HorizontalResolution; 
float dpiy = qrImg.VerticalResolution; 
var _newWidth = (10 * qrImg.Width - 46 * margin) * 1.0f / 46; 
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(0, 0, newImgWidth - 1, newImgWidth - 1); 
using (GraphicsPath path = CreateRoundedRectanglePath(rect, 7)) 
{ 
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(0, 0, _headerImg.Width - 1, _headerImg.Width - 1); 
using (GraphicsPath path1 = CreateRoundedRectanglePath(rect1, 7)) 
{ 
g1.DrawPath(p1, path1); 
TextureBrush brush = new TextureBrush(_headerImg); 
g1.FillPath(brush, path1); 
} 
g1.Dispose(); 
PointF center = new PointF((newImgWidth - _headerImg.Width) / 2, (newImgWidth - _headerImg.Height) / 2); 
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, 0, 0); 
PointF center2 = new PointF((qrImg.Width - headerBgImg.Width) / 2, (qrImg.Height - headerBgImg.Height) / 2); 
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 * 2, cornerRadius * 2, 180, 90); 
roundedRect.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * 2, rect.Y); 
roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y, cornerRadius * 2, cornerRadius * 2, 270, 90); 
roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2); 
roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90); 
roundedRect.AddLine(rect.Right - cornerRadius * 2, rect.Bottom, rect.X + cornerRadius * 2, rect.Bottom); 
roundedRect.AddArc(rect.X, rect.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90); 
roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.X, rect.Y + cornerRadius * 2); 
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(0, 0, newImage.Width, newImage.Height), new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel); 
newG.Dispose(); 
return newImage; 
} 
#endregion 
} 


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值