07
2015
06

【C#、Asp.Net 工具类大全】QrCode二维码生成工具类

使用实例:

private string urlPath = "";
protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        urlPath = Server.MapPath("~/file/");
        qrCodeInfo();
    }
}
/// <summary>
/// 二维码生成
/// </summary>
private void qrCodeInfo()
{
    Response.Write("<IMG alt=\"" + "" + "\" src=\"" + "file/" + QrCodeHelper.getQrCodePath("https://www.zhengdecai.com/", "8", urlPath, "zhengdecai_qr.png") + "\" border=\"0\">" + "&nbsp;");
    Response.Write("<IMG alt=\"" + "" + "\" src=\"" + "file/" + QrCodeHelper.getQrCodePath("https://www.zhengdecai.com/", "8", urlPath + "zhengdecai_logo.png", urlPath, "zhengdecai_qr_logo.png") + "\" border=\"0\">" + "<br />");
}

类库信息:

/// <summary>
///二维码生成
/// </summary>
public class QrCodeHelper
{
    #region 二维码生成
    /// <summary>
    /// 生成二维码图片
    /// </summary>
    /// <param name="Url">二维码地址</param>
    /// <param name="txt_size">生成图片大小</param>
    /// <param name="filepath">生成后的存放路径</param>
    /// <param name="filename">生成后的文件名</param>
    /// <returns>返回生成后的图片文件名</returns>
    public static string getQrCodePath(string Url, string txt_size, string filepath, string filename)
    {
        string txt_qr = ConverToGB(Url, 16);
        string qrEncoding = "Byte";
        string Level = "M";
        string txt_ver = "7";
        QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
        String encoding = qrEncoding;
        if (encoding == "Byte")
        {
            qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
        }
        //else if (encoding == "AlphaNumeric")
        //{
        //    qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC;
        //}
        //else if (encoding == "Numeric")
        //{
        //    qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC;
        //}
        try
        {
            int scale = Convert.ToInt16(txt_size);
            qrCodeEncoder.QRCodeScale = scale;
        }
        catch (Exception ex)
        {
            return "";
        }
        try
        {
            int version = Convert.ToInt16(txt_ver);
            qrCodeEncoder.QRCodeVersion = version;
        }
        catch (Exception ex)
        {
            return "";
        }
        string errorCorrect = Level;
        if (errorCorrect == "L")
            qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;
        //else if (errorCorrect == "M")
        //    qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
        //else if (errorCorrect == "Q")
        //    qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.Q;
        //else if (errorCorrect == "H")
        //    qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;
        Bitmap image;
        String data = txt_qr;
        image = qrCodeEncoder.Encode(data);
        System.IO.FileStream fs = new System.IO.FileStream(filepath + filename, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
        image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
        fs.Close();
        image.Dispose();
        if (File.Exists(filepath + filename) == true) //判断是否已经上传
        {
            return filename;
        }
        else
        {
            return "";
        }
    }
    /// <summary>
    /// 生成二维码图片
    /// </summary>
    /// <param name="Url">二维码地址</param>
    /// <param name="txt_size">生成图片大小</param>
    /// <param name="logopath">Logo图片路径</param>
    /// <param name="filepath">生成后的存放路径</param>
    /// <param name="filename">生成后的文件名</param>
    /// <returns>返回生成后的图片文件名</returns>
    public static string getQrCodePath(string Url, string txt_size, string logopath, string filepath, string filename)
    {
        string fileAbsPath = logopath;
        string txt_qr = ConverToGB(Url, 16);
        string qrEncoding = "Byte";
        string Level = "M";
        string txt_ver = "7";
        QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
        String encoding = qrEncoding;
        if (encoding == "Byte")
        {
            qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
        }
        try
        {
            int scale = Convert.ToInt16(txt_size);
            qrCodeEncoder.QRCodeScale = scale;
        }
        catch (Exception ex)
        {
            return "";
        }
        try
        {
            int version = Convert.ToInt16(txt_ver);
            qrCodeEncoder.QRCodeVersion = version;
        }
        catch (Exception ex)
        {
            return "";
        }
        string errorCorrect = Level;
        if (errorCorrect == "L")
            qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;
        Bitmap image;
        String data = txt_qr;
        image = qrCodeEncoder.Encode(data);
        System.IO.FileStream fs = new System.IO.FileStream(filepath + filename, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write);
        image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
        fs.Close();
        image.Dispose();
        int resultVal = (int)ReturnVal.Succeed;
        if (resultVal == 1)
        {
            string imgFile = ImageWatermark(filepath + filename, fileAbsPath, 30);
            if (File.Exists(imgFile))
            {
                File.Delete(imgFile);
            }
        }
        if (File.Exists(filepath + filename) == true) //判断是否已经上传
        {
            return filename;
        }
        else
        {
            return "";
        }
    }
    #endregion
    #region 二维码生成辅助
    #region 返回值
    /// <summary>
    /// 返回值
    /// </summary>
    private enum ReturnVal : int
    {
        /// <summary>
        /// 不能上传 0 K大小的文件
        /// </summary>
        FileEmpty = -2,
        /// <summary>
        /// 未选中文件
        /// </summary>
        NotSelected = -1,
        /// <summary>
        /// 上传失败
        /// </summary>
        Failed = 0,
        /// <summary>
        /// 成功
        /// </summary>
        Succeed = 1
    }
    #endregion
    /// <summary>  
    /// 10进制或16进制转换为中文  
    /// </summary>  
    /// <param name="name">要转换的字符串</param>  
    /// <param name="fromBase">进制(10或16)</param>  
    /// <returns></returns>  
    public static string ConverToGB(string text, int fromBase)
    {
        string value = text;
        MatchCollection mc;
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        switch (fromBase)
        {
            case 10:
                MatchCollection mc1 = Regex.Matches(text, @"&#([\d]{5})", RegexOptions.Compiled | RegexOptions.IgnoreCase);
                foreach (Match _v in mc1)
                {
                    string w = _v.Value.Substring(2);
                    w = Convert.ToString(int.Parse(w), 16);
                    byte[] c = new byte[2];
                    string ss = w.Substring(0, 2);
                    int c1 = Convert.ToInt32(w.Substring(0, 2), 16);
                    int c2 = Convert.ToInt32(w.Substring(2), 16);
                    c[0] = (byte)c2;
                    c[1] = (byte)c1;
                    sb.Append(Encoding.Unicode.GetString(c));
                }
                value = sb.ToString();
                break;
            case 16:
                mc = Regex.Matches(text, @"\\u([\w]{2})([\w]{2})", RegexOptions.Compiled | RegexOptions.IgnoreCase);
                if (mc != null && mc.Count > 0)
                {
                    foreach (Match m2 in mc)
                    {
                        string v = m2.Value;
                        string w = v.Substring(2);
                        byte[] c = new byte[2];
                        int c1 = Convert.ToInt32(w.Substring(0, 2), 16);
                        int c2 = Convert.ToInt32(w.Substring(2), 16);
                        c[0] = (byte)c2;
                        c[1] = (byte)c1;
                        sb.Append(Encoding.Unicode.GetString(c));
                    }
                    value = sb.ToString();
                }
                break;
        }
        return value;
    }
    /// <summary>
    /// 图片水印处理方法
    /// </summary>
    /// <param name="path">需要加载水印的图片路径(绝对路径)</param>
    /// <param name="waterpath">水印图片(绝对路径)</param>
    /// <param name="waterpath">水印图片最大宽度</param>
    /// <returns></returns>
    private static string ImageWatermark(string path, string waterpath, int maxW)
    {
        //获取文件扩展名
        string kz_name = Path.GetExtension(path);
        string fileNames = "";
        //暂时只支持给.JPG,.BMP,.JPEG格式加水印
        if (kz_name == ".jpg" || kz_name == ".bmp" || kz_name == ".jpeg" || kz_name == ".png" || kz_name == ".gif")
        {
            //设置新的文件名
            DateTime time = DateTime.Now;
            string filename = "" + time.Year.ToString() + time.Month.ToString() + time.Day.ToString() + time.Hour.ToString() + time.Minute.ToString() + time.Second.ToString() + time.Millisecond.ToString();
            //加载需要加载水印的图片
            Image img = Bitmap.FromFile(path);
            //加载水印图片
            Image waterimg = Image.FromFile(waterpath);
            //添加水印
            Graphics g = Graphics.FromImage(img);
            //获取水印位置设置
            ArrayList loca = new ArrayList();
            int x = 0;
            int y = 0;
            int width = maxW;
            int height = waterimg.Height / (waterimg.Width / maxW);
            int cH = 0;
            if (height < maxW)
            {
                cH = maxW - height;
            }
            x = img.Width / 2 - width / 2;
            y = img.Height / 2 - height / 2 + cH / 2;
            loca.Add(x);
            loca.Add(y);
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;    //这里是矩形框居中
            sf.LineAlignment = StringAlignment.Center;  //这里是文本居中
            g.DrawImage(waterimg, new Rectangle(int.Parse(loca[0].ToString()), int.Parse(loca[1].ToString()), width, height));
            //释放资源
            waterimg.Dispose();
            g.Dispose();
            //保存水印图片
            string newpath = Path.GetDirectoryName(path) + "\\" + filename + kz_name;
            fileNames = filename + kz_name;
            img.Save(newpath);
            img.Dispose();
            //将水印复制到原有图片
            //将水印图片替换原有图片
            File.Copy(newpath, path, true);
            //删除水印
            if (File.Exists(newpath))
            {
                File.Delete(newpath);
            }
        }
        else
        {
            fileNames = "";
        }
        return fileNames;
    }
    #endregion
}

显示效果:

在生成二维码时候,需要引用“ThoughtWorks.QRCode.dll”,这个可以请教度娘

以上类库内容来源互联网,站长稍作整理

« 上一篇下一篇 »

评论列表:

1.滚筒输送机  2015/6/9 11:59:57 回复该留言
真是看晕了。。。
2.火锅桌椅  2015/6/12 17:34:27 回复该留言
对于编程类看了也白看,没有功底是看不明白的/
3.火锅桌椅  2015/6/12 17:34:52 回复该留言
很不错,有时间去弄下

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。