欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#基于QRCode实现动态生成自定义二维码图片功能示例

程序员文章站 2023-12-10 09:38:10
本文实例讲述了c#基于qrcode实现动态生成自定义二维码图片功能。分享给大家供大家参考,具体如下: 二维码早就传遍大江南北了,总以为它是个神奇的东西,其实细细研究之后发...

本文实例讲述了c#基于qrcode实现动态生成自定义二维码图片功能。分享给大家供大家参考,具体如下:

二维码早就传遍大江南北了,总以为它是个神奇的东西,其实细细研究之后发现也没想象的那么神秘,碰巧最近项目中需要动态生成二维码,解决完实际问题之后,简单总结整理一下。项目中除了动态生成二维码之外,还实现了动态生成自定义图片,二维码可以是其中的元素。

设置图片的数据源为动态图片

<body>
  <form id="form1" runat="server" >
  <div>
    <img src="generateimage.aspx?type=2" />
  </div>
  </form>
</body>

动态生成图片

generateimage.aspx.cs文件内容

protected void page_load(object sender, eventargs e)
{
  string type = request.querystring["type"].tostring();
  bitmap codeimage = create_qrcode("分享才能获得更多,我尽力而为(5201314)", 6);
  memorystream ms = create_imgcode(codeimage, "分享才能获得更多,我尽力而为", "5201314", type);
  response.clearcontent();
  response.contenttype = "image/png";
  response.binarywrite(ms.toarray());
  response.end();
}
private bitmap create_qrcode(string codenumber, int size)
{
  //创建二维码生成类
  qrcodeencoder qrcodeencoder = new qrcodeencoder();
  //设置编码模式
  qrcodeencoder.qrcodeencodemode = qrcodeencoder.encode_mode.byte;
  //设置编码测量度
  qrcodeencoder.qrcodescale = size;
  //设置编码版本
  qrcodeencoder.qrcodeversion = 10;
  //设置编码错误纠正
  qrcodeencoder.qrcodeerrorcorrect = qrcodeencoder.error_correction.m;
  //生成二维码图片
  system.drawing.bitmap codeimage = qrcodeencoder.encode(codenumber, encoding.utf8);
  return codeimage;
}
/// <summary>
/// 生成自定义图片
/// </summary>
/// <param name="codeimage">生成的二维码</param>
/// <param name="objectname">物体名称</param>
/// <returns>自定义图片内存流</returns>
private memorystream create_imgcode(bitmap codeimage, string objectname, string objectcode, string type)
{
  string path = string.empty;
  if (type == "1")
  {
    //设置背景图片
    path = server.mappath("images/backimg1.png");
  }
  else if (type == "2")
  {
    //设置背景图片
    path = server.mappath("images/backimg2.png");
  }
  system.drawing.image img = system.drawing.image.fromfile(path);
  bitmap bg = new bitmap(img);
  //为画布bg(图片bg)创建一只画笔
  graphics g = graphics.fromimage(bg);
  if (type == "1")
  {
    //【1】将位图文件codeimage画到画布g上
    //【2】codeimage左上角距画布左边界25px、距画布上边界56px
    //【3】codeimage的长为原长、宽为原宽
    g.drawimage(codeimage, 25, 56, codeimage.width, codeimage.height);
  }
  else if (type == "2")
  {
    g.drawimage(codeimage, 132, 19, 162, 162);
    system.drawing.brush b = new solidbrush(color.black);
    font font = new font("宋体", 8, fontstyle.regular);
    stringformat sf = new stringformat();
    sf.linealignment = stringalignment.center; // 垂直居中
    sf.alignment = stringalignment.near;    // 水平左对齐
    //string也是画到画布上的,当画的string长度大于112px时会自动换行
    sizef stringsize = g.measurestring("我的宣言:", font, 112, sf);
    int nwidth = (int)stringsize.width + 1;
    int nheight = (int)stringsize.height + 1;
    rectanglef rf = new rectangle(new point(12, 64), new size(nwidth, nheight));
    g.drawstring("我的宣言:", font, b, rf, sf);
    stringsize = g.measurestring(objectname, font, 112, sf);
    int objectwidth = (int)stringsize.width + 1;
    int objectheight = (int)stringsize.height + 1;
    rf = new rectangle(new point(12, 64 + nheight + 8), new size(objectwidth, objectheight));
    g.drawstring(objectname, font, b, rf, sf);
    sizef stringsize1 = g.measurestring("幸运数字:", font, 112, sf);
    nwidth = (int)stringsize1.width + 1;
    nheight = (int)stringsize1.height + 1;
    rectanglef rf1 = new rectangle(new point(12, 136), new size(nwidth, nheight));
    g.drawstring("幸运数字:", font, b, rf1, sf);
    stringsize1 = g.measurestring(objectcode, font, 112, sf);
    objectwidth = (int)stringsize1.width + 1;
    objectheight = (int)stringsize1.height + 1;
    rf1 = new rectangle(new point(12, 136 + nheight + 8), new size(objectwidth, objectheight));
    g.drawstring(objectcode, font, b, rf1, sf);
  }
  g.dispose();
  gc.collect();
  system.io.memorystream ms = new system.io.memorystream();
  bg.save(ms, system.drawing.imaging.imageformat.png);
  //将画布bg(图片bg)保存到指定路径
  path = server.mappath("images");
  bg.save(path + "\\photoname.png", system.drawing.imaging.imageformat.png);
  codeimage.dispose();
  bg.dispose();
  return ms;
}

thoughtworks.qrcode.dll点击此处本站下载

ps:本站还提供了一个功能十分强悍的在线二维码生成工具,可实现文本、电话号码、短信、邮件、网址等的二维码生成及logo图标添加功能:

在线生成二维码工具(加强版):

更多关于c#相关内容感兴趣的读者可查看本站专题:《c#图片操作技巧汇总》、《c#常见控件用法教程》、《winform控件用法总结》、《c#数据结构与算法教程》、《c#面向对象程序设计入门教程》及《c#程序设计之线程使用技巧总结

希望本文所述对大家c#程序设计有所帮助。