zoukankan      html  css  js  c++  java
  • 生成二维码、条形码、带logo的二维码

    Nuget安装ZXing.Net,帮助类:

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Drawing.Imaging;
    using ZXing;
    using ZXing.Common;
    using ZXing.QrCode;
    using ZXing.QrCode.Internal;
    
    namespace CommonHelper
    {
        public class BarcodeHelper
        {
            /// <summary>
            /// 生成二维码
            /// </summary>
            /// <param name="text">内容</param>
            /// <param name="width">宽度</param>
            /// <param name="height">高度</param>
            /// <returns></returns>
            public static Bitmap Generate1(string text, int width, int height)
            {
                BarcodeWriter writer = new BarcodeWriter();
                writer.Format = BarcodeFormat.QR_CODE;
                QrCodeEncodingOptions options = new QrCodeEncodingOptions()
                {
                    DisableECI = true,//设置内容编码
                    CharacterSet = "UTF-8",  //设置二维码的宽度和高度
                    Width = width,
                    Height = height,
                    Margin = 1//设置二维码的边距,单位不是固定像素
                };
    
                writer.Options = options;
                Bitmap map = writer.Write(text);
                return map;
            }
    
            /// <summary>
            /// 生成一维条形码
            /// </summary>
            /// <param name="text">内容</param>
            /// <param name="width">宽度</param>
            /// <param name="height">高度</param>
            /// <returns></returns>
            public static Bitmap Generate2(string text, int width, int height)
            {
                BarcodeWriter writer = new BarcodeWriter();
                //使用ITF 格式,不能被现在常用的支付宝、微信扫出来
                //如果想生成可识别的可以使用 CODE_128 格式
                //writer.Format = BarcodeFormat.ITF;
                writer.Format = BarcodeFormat.CODE_39;
                EncodingOptions options = new EncodingOptions()
                {
                    Width = width,
                    Height = height,
                    Margin = 2
                };
                writer.Options = options;
                Bitmap map = writer.Write(text);
                return map;
            }
    
            /// <summary>
            /// 生成带Logo的二维码
            /// </summary>
            /// <param name="text">内容</param>
            /// <param name="width">宽度</param>
            /// <param name="height">高度</param>
            public static Bitmap Generate3(string text, int width, int height)
            {
                //Logo 图片
                string logoPath = System.AppDomain.CurrentDomain.BaseDirectory + @"imglogo.png";
                Bitmap logo = new Bitmap(logoPath);
                //构造二维码写码器
                MultiFormatWriter writer = new MultiFormatWriter();
                Dictionary<EncodeHintType, object> hint = new Dictionary<EncodeHintType, object>();
                hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
                hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
                //hint.Add(EncodeHintType.MARGIN, 2);//旧版本不起作用,需要手动去除白边
    
                //生成二维码 
                BitMatrix bm = writer.encode(text, BarcodeFormat.QR_CODE, width + 30, height + 30, hint);
                bm = deleteWhite(bm);
                BarcodeWriter barcodeWriter = new BarcodeWriter();
                Bitmap map = barcodeWriter.Write(bm);
    
                //获取二维码实际尺寸(去掉二维码两边空白后的实际尺寸)
                int[] rectangle = bm.getEnclosingRectangle();
    
                //计算插入图片的大小和位置
                int middleW = Math.Min((int)(rectangle[2] / 3), logo.Width);
                int middleH = Math.Min((int)(rectangle[3] / 3), logo.Height);
                int middleL = (map.Width - middleW) / 2;
                int middleT = (map.Height - middleH) / 2;
    
                Bitmap bmpimg = new Bitmap(map.Width, map.Height, PixelFormat.Format32bppArgb);
                using (Graphics g = Graphics.FromImage(bmpimg))
                {
                    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                    g.DrawImage(map, 0, 0, width, height);
                    //白底将二维码插入图片
                    g.FillRectangle(Brushes.White, middleL, middleT, middleW, middleH);
                    g.DrawImage(logo, middleL, middleT, middleW, middleH);
                }
                return bmpimg;
            }
    
            /// <summary>
            /// 删除默认对应的空白
            /// </summary>
            /// <param name="matrix"></param>
            /// <returns></returns>
            private static BitMatrix deleteWhite(BitMatrix matrix)
            {
                int[] rec = matrix.getEnclosingRectangle();
                int resWidth = rec[2] + 1;
                int resHeight = rec[3] + 1;
    
                BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
                resMatrix.clear();
                for (int i = 0; i < resWidth; i++)
                {
                    for (int j = 0; j < resHeight; j++)
                    {
                        if (matrix[i + rec[0], j + rec[1]])
                            resMatrix[i, j] = true;
                    }
                }
                return resMatrix;
            }
        }
    }

    使用:保存为文件流

    public ActionResult GenerateBarCode(string contents)
            {
                MemoryStream ms = new MemoryStream();
                Bitmap bitmap = BarcodeHelper.Generate2(contents, 270, 50);
                Graphics g = Graphics.FromImage(bitmap);
                bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                g.Dispose();
                bitmap.Dispose();
                return File(ms.ToArray(), "image/jpeg");
            }

    保存为文件:

    /// <summary>
            /// 生成条形码
            /// </summary>
            /// <param name="code"></param>
            /// <returns></returns>
            public static string GenerateBarCode(string contents)
            {
                string fileName = AppDomain.CurrentDomain.BaseDirectory + "BarCode\" + Guid.NewGuid().ToString() + ".jpg";
                fileName = fileName.Replace("\bin\Debug", "");
                MemoryStream ms = new MemoryStream();
                Bitmap bitmap = BarcodeHelper2.Generate2(contents, 270, 50);
                Graphics g = Graphics.FromImage(bitmap);
                bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                g.Dispose();
                bitmap.Dispose();
                using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    byte[] buffer = ms.ToArray();//转化为byte格式存储
                    fs.Write(buffer, 0, buffer.Length);
                    fs.Flush();
                    buffer = null;
                }
                return fileName;
            }

    MVC页面:

    <img src='/Home/GenerateBarCode?proCode=xxx' />

    参考:https://www.cnblogs.com/hsiang/p/8452984.html

  • 相关阅读:
    Sitecore 9 为什么数据驱动的组织选择它
    Sitecore 个性化
    Sitecore 9 您应该了解的所有新功能和变化
    Sitecore客户体验成熟度模型之旅
    Sitecore 8.2 工作流程
    sitecore-多变量测试与A / B测试概念论述
    sitecore
    cesium1.65api版本贴地贴模型标绘工具效果(附源码下载)
    leaflet结合geoserver利用WFS服务实现图层新增功能(附源码下载)
    openlayers6实现webgl点图层渲染效果(附源码下载)
  • 原文地址:https://www.cnblogs.com/xsj1989/p/10550533.html
Copyright © 2011-2022 走看看