当前位置: 移动技术网 > IT编程>开发语言>c# > C#生成带logo的二维码

C#生成带logo的二维码

2019年07月18日  | 移动技术网IT编程  | 我要评论
带logo的二维码生成分为两步骤:首先根据输入的内容生成二维码图片,然后读取本地的logo图片,通过图片处理生成带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 = 4;//设置编码测量度    
    qrcodeencoder.qrcodeversion = 7;//设置编码版本 
    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 = 10;
   float dpix = qrimg.horizontalresolution;
   float dpiy = qrimg.verticalresolution;
   var _newwidth = (10 * qrimg.width - 36 * margin) * 1.0f / 36;
   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, 1))
   {
    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, 1))
   {
    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;
  }
  /// <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 = 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;
  }
  #endregion
 }

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持移动技术网!

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网