zoukankan      html  css  js  c++  java
  • C# 生成条形码、二维码

    记录一下使用ZXing生成条形码和二维码的过程,Nuget自行获取即可,就下面这个。

    话不多说,直接上才艺!

    1.生成条形码

            /// <summary>
            /// 生成一维条形码
            /// </summary>
            /// <param name="text">内容</param>
            /// <param name="width">宽度</param>
            /// <param name="height">高度</param>
            /// <returns></returns>
            public static Bitmap GenerateBarcode(string text, int width, int height)
            {
                BarcodeWriter writer = new BarcodeWriter();
                writer.Format = BarcodeFormat.CODE_128;
                EncodingOptions options = new EncodingOptions()
                {
                    Width = width,
                    Height = height,
                    Margin = 2
                };
                writer.Options = options;
                Bitmap map = writer.Write(text);
                return map;
            }
    
            /// <summary>
            /// 获取条形码图片中的内容
            /// </summary>
            /// <param name="picPath"></param>
            /// <returns></returns>
            public static string GetBarcodeFromPic(string picPath)
            {
                try
                {
                    Bitmap img = new Bitmap(picPath);
                    var decodeOption = new DecodingOptions();
                    var reader = new BarcodeReader();
                    reader.Options = decodeOption;
                    Result result = reader.Decode(img);
                    return result.ToString();
                }
                catch (Exception)
                {
                    return null;
                }
            }
    

    2.生成二维码

            /// <summary>
            /// 生成二维码
            /// </summary>
            /// <param name="text">内容</param>
            /// <param name="width">宽度</param>
            /// <param name="height">高度</param>
            /// <returns></returns>
            public static Bitmap GenerateQrCode(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>
            /// 生成带Logo的二维码
            /// </summary>
            /// <param name="text">内容</param>
            /// <param name="width">宽度</param>
            /// <param name="height">高度</param>
            public static Bitmap GenerateQrCodeWithLogo(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;
            }
    
  • 相关阅读:
    【微信公众号开发】【13】批量导出公众号所有用户信息到Excel
    【实战问题】【1】@PostConstruct 服务启动后加载两次的问题
    敌兵布阵(树状数组)
    Java大数应用
    Exponentiation(java 大实数)
    确定比赛名次(拓扑排序)
    487-3279(输入外挂)
    More is better(并查集)
    How Many Tables(并查集)
    Convex(扫描线降维)
  • 原文地址:https://www.cnblogs.com/LukeSteven/p/14784767.html
Copyright © 2011-2022 走看看