winfrom 二维码 条形码生成

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_40338997/article/details/85325893

**

winfrom 二维码 条形码生成

**
1.下载包
在这里插入图片描述
下载包

2.控件PictureBox
PictureBox
PictureBox
3.代码

/// <summary>
        /// 描述:条形码和二维码类
        /// </summary>
        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_128;
                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 + @"\img\logo.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;
            }
        }

猜你喜欢

转载自blog.csdn.net/qq_40338997/article/details/85325893
今日推荐