C#实现二维码的简单生成

引用:ThoughtWorks.QRCode.dll

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Drawing;
using System.Text;
using ThoughtWorks.QRCode.Codec;//二维码引用

namespace CCOA.BLL.Common
{
    public class qrcode
    {

        /// <summary>
        /// 生成简易二维码存储
        /// </summary>
        /// <param name="url">二维码内容</param>
        /// <returns>返回虚拟地址</returns>
        public static string SetQRcode(string url)
        {
            if (string.IsNullOrEmpty(url))
            {
                return "";
            }

            System.Drawing.Bitmap bt;
            QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
            qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//编码方式(注意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字)
            qrCodeEncoder.QRCodeScale = 4;//大小(值越大生成的二维码图片像素越高)
            qrCodeEncoder.QRCodeVersion = 0;//版本(注意:设置为0主要是防止编码的字符串太长时发生错误)
            qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//错误效验、错误更正(有4个等级)
            qrCodeEncoder.QRCodeBackgroundColor = Color.White;//背景色
            qrCodeEncoder.QRCodeForegroundColor = Color.Black;//前景色
            bt = qrCodeEncoder.Encode(url, Encoding.UTF8);
            string filename = DateTimeToTimestamp(DateTime.Now).ToString() + ".jpg";
            string file_path = AppDomain.CurrentDomain.BaseDirectory + "QRCodeImage\\";
            string codeUrl = file_path + filename;

            //根据文件名称,自动建立对应目录
            if (!System.IO.Directory.Exists(file_path))
                System.IO.Directory.CreateDirectory(file_path);
            bt.Save(codeUrl);//保存图片
            return "/QRCodeImage/" + filename;
        }

        /// <summary>
        /// 生成带logo的二维码存储
        /// </summary>
        /// <param name="url">二维码内容</param>
        /// <param name="logo">中心logo</param>
        /// <param name="IsSquare">logo是否为正方形 </param>
        /// <returns>返回虚拟地址</returns>
        public static string SetQRcode(string url, string logo, bool IsSquare=true)
        {
            try
            {
                if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(logo)) {
                    return "";
                }

                QRCodeEncoder encoder = new QRCodeEncoder();
                encoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//编码方式(注意:BYTE能支持中文,ALPHA_NUMERIC扫描出来的都是数字)
                encoder.QRCodeScale = 5;//大小(值越大生成的二维码图片像素越高)
                encoder.QRCodeVersion = 0;//版本(注意:设置为0主要是防止编码的字符串太长时发生错误)
                encoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;//错误效验、错误更正(有4个等级)
                encoder.QRCodeBackgroundColor = Color.White;
                encoder.QRCodeForegroundColor = Color.Black;
                System.Drawing.Image image = encoder.Encode(url, Encoding.UTF8);

                //查看图片地址是否为空
                if (!string.IsNullOrEmpty(logo)) {
                    Graphics g = Graphics.FromImage(image);
                    int width1 = image.Width / 3;
                    int height1 = image.Height / 5;
                    if (IsSquare)
                    {
                        //正方形Logo
                        width1 = image.Width / 4;
                        height1 = image.Height / 4;
                    }
                    else
                    {
                        //长方形logo
                        width1 = image.Width / 3;
                        height1 = image.Height / 5;
                    }

                    int x = image.Width / 2 - width1 / 2;
                    int y = image.Height / 2 - height1 / 2;
                    g.FillRectangle(new SolidBrush(Color.White), x, y, width1, height1);
                    Image LogImage = GetImage(logo);
                    Bitmap copyImage = new Bitmap(LogImage, width1 - image.Width / 40, height1 - image.Height / 40);
                    g.DrawImage(copyImage, x + image.Width / 40 / 2, y + image.Height / 40 / 2);
                    copyImage.Dispose();
                    g.Dispose();
                }

                string filename = DateTimeToTimestamp(DateTime.Now).ToString() + ".jpg";
                string file_path = AppDomain.CurrentDomain.BaseDirectory + "QRCodeImage\\";
                string codeUrl = file_path + filename;

                //根据文件名称,自动建立对应目录
                if (!System.IO.Directory.Exists(file_path))
                    System.IO.Directory.CreateDirectory(file_path);
                image.Save(codeUrl);//保存图片
                return "/QRCodeImage/" + filename;
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /// <summary>
        /// 通过图片虚拟路径 获取Image
        /// </summary>
        /// <param name="url">要访问的图片所在网址</param>
        /// <returns>Image</returns>
        public static Image GetImage(string url)
        {
            Image image;
            System.Net.WebRequest webreq = System.Net.WebRequest.Create(url);
            System.Net.WebResponse webres = webreq.GetResponse();
            using (System.IO.Stream stream = webres.GetResponseStream())
            {
                image = Image.FromStream(stream);
            }

            return image;
        }

        /// <returns>生成时间戳</returns>
        public static long DateTimeToTimestamp(DateTime datetime)
        {
            DateTime dd = new DateTime(1970, 1, 1, 0, 0, 0, 0);
            DateTime timeUTC = DateTime.SpecifyKind(datetime, DateTimeKind.Utc);//本地时间转成UTC时间
            TimeSpan ts = (timeUTC - dd);
            return (Int64)ts.TotalMilliseconds;//精确到毫秒
        }  
    }
 }
复制代码

 

posted @   ~且听风吟~  阅读(499)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示