c#生成一维码,二维码。文字,可以设置尺寸大小,以及显示位置

时间:2024-02-18 20:56:30

对一维码。以及二维码生成进行配置生成,并且可以实现添加文字内容实现x,y轴定位坐标位置

1.以下方法是生成一维码,二维码,文字的通用方法

        /// <summary>
        /// 添加字体方法  
        /// </summary>
        /// <param name="g">Graphics g  ,目标Graphics对象 </param>
        /// <param name="drawPoint">PointF drawPoint,存储坐标位置</param>
        /// <param name="data">string data  ,准备添加的字符串</param>
        /// <param name="size">大小</param>
        private void AddFont(Graphics g, PointF drawPoint, string data, int size)
        {
            SolidBrush mybrush = new SolidBrush(Color.Black);  //设置默认画刷颜色
            Font myfont = new Font("宋体", size, FontStyle.Regular);     //设置默认字体格式   
            g.DrawString(data, myfont, mybrush, drawPoint); //图片上添加文字
            //刷新pictureBox调用此方法:pictureBox1.Refresh();
        }

        /// <summary>
        /// 生成二维码  引用:using ThoughtWorks.QRCode.Codec;
        /// </summary>
        /// <param name="g">Graphics g  ,目标Graphics对象 </param>
        /// <param name="drawPoint">PointF drawPoint,存储坐标位置</param>
        /// <param name="data">string data  ,准备添加的字符串</param>
        /// <param name="width">二维码宽度</param>
        /// <param name="height">二维码高度</param>
        private void CreateQRCode(Graphics g, PointF drawPoint, string data, int width, int height)
        {
            QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
            qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
            qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
            qrCodeEncoder.QRCodeScale = 3; //作为初始定义,没有实际意义
            qrCodeEncoder.QRCodeVersion = 7; //二维码生成的类型//Encoding.UTF8为必备参数,否则某些中文字符无法识别
            System.Drawing.Image image = qrCodeEncoder.Encode(data, Encoding.UTF8);

            #region 根据设定的目标图片尺寸调整二维码QRCodeScale设置
            if (width > 0)
            {
                //当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸
                #region 当设定目标图片尺寸大于生成的尺寸时,逐步增大方格尺寸
                while (image.Width < width)
                {
                    qrCodeEncoder.QRCodeScale++;
                    System.Drawing.Image imageNew = qrCodeEncoder.Encode(data, Encoding.UTF8);
                    if (imageNew.Width < width)
                    {
                        image = new System.Drawing.Bitmap(imageNew);
                        imageNew.Dispose();
                        imageNew = null;
                    }
                    else
                    {
                        qrCodeEncoder.QRCodeScale--; //新尺寸未采用,恢复最终使用的尺寸
                        imageNew.Dispose();
                        imageNew = null;
                        break;
                    }
                }
                #endregion

                //当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸
                #region 当设定目标图片尺寸小于生成的尺寸时,逐步减小方格尺寸
                while (image.Width > width && qrCodeEncoder.QRCodeScale > 1)
                {
                    qrCodeEncoder.QRCodeScale--;
                    System.Drawing.Image imageNew = qrCodeEncoder.Encode(data, Encoding.UTF8);
                    image = new System.Drawing.Bitmap(imageNew);
                    imageNew.Dispose();
                    imageNew = null;
                    if (image.Width < width)
                    {
                        break;
                    }
                }
                #endregion
            }
            #endregion
            g.DrawImage(image, drawPoint);
        }


        /// <summary>
        /// 生成一维码 引用:using BarcodeLib
        /// </summary>
        /// <param name="g">Graphics g  ,目标Graphics对象 </param>
        /// <param name="drawPoint">PointF drawPoint,存储坐标位置</param>
        /// <param name="data">string data  ,准备添加的字符串</param>
        /// <param name="width">二维码宽度</param>
        /// <param name="height">二维码高度</param>
        private void CreateBrCode(Graphics g, PointF drawPoint, string data, int width, int height)
        {
            var barcode = new Barcode();
            barcode.IncludeLabel = false; //是否显示下方数字
            barcode.Alignment = AlignmentPositions.CENTER;  //居中显示
            barcode.Width = width;   //宽度
            barcode.Height = height; //高度
            barcode.RotateFlipType = RotateFlipType.RotateNoneFlipNone;//无旋转
            barcode.BackColor = Color.White; //背景颜色
            barcode.ForeColor = Color.Black; //条形码颜色
            Image barcodeImg = barcode.Encode(TYPE.CODE128B, data);  //将字符进行转化Image
            g.DrawImage(barcodeImg, drawPoint);
        }

2.在这里通过winform的按钮事件去调用,也可以根据实际操作去调用

        /// <summary>
        /// 生成按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(txt_QrCode.Text) && string.IsNullOrWhiteSpace(txt_Font1_Content.Text) && string.IsNullOrWhiteSpace(txt_Font2_Content.Text) && string.IsNullOrWhiteSpace(txt_Font3_Content.Text))
            {
                MessageBox.Show("条码内容以及文字内容必须填写一项");
                return;
            }
            if (!string.IsNullOrWhiteSpace(txt_QrCode.Text))
            {
                if (string.IsNullOrWhiteSpace(txt_QrCodeX.Text) || string.IsNullOrWhiteSpace(txt_QrCodeY.Text) || string.IsNullOrWhiteSpace(txt_QrCodeWidth.Text) || string.IsNullOrWhiteSpace(txt_QrCodeHeight.Text))
                {
                    MessageBox.Show("条码内容不为空,请填写完整的条码信息内容");
                    return;
                }
                if (radioButton2.Checked)
                {
                    if (txt_QrCodeWidth.Text != txt_QrCodeHeight.Text)
                    {
                        MessageBox.Show("二维码的宽度,高度应该保持一致");
                        return;
                    }
                }
            }
            if (!string.IsNullOrWhiteSpace(txt_Font1_Content.Text))
            {
                if (string.IsNullOrWhiteSpace(txt_Font1_X.Text) || string.IsNullOrWhiteSpace(txt_Font1_Y.Text) || string.IsNullOrWhiteSpace(txt_Font1_Size.Text))
                {
                    MessageBox.Show("文字1内容不为空,请填写完整的文字1信息内容");
                    return;
                }
            }
            if (!string.IsNullOrWhiteSpace(txt_Font2_Content.Text))
            {
                if (string.IsNullOrWhiteSpace(txt_Font2_X.Text) || string.IsNullOrWhiteSpace(txt_Font2_Y.Text) || string.IsNullOrWhiteSpace(txt_Font2_Size.Text))
                {
                    MessageBox.Show("文字2内容不为空,请填写完整的文字2信息内容");
                    return;
                }
            }
            if (!string.IsNullOrWhiteSpace(txt_Font3_Content.Text))
            {
                if (string.IsNullOrWhiteSpace(txt_Font3_X.Text) || string.IsNullOrWhiteSpace(txt_Font3_Y.Text) || string.IsNullOrWhiteSpace(txt_Font3_Size.Text))
                {
                    MessageBox.Show("文字3内容不为空,请填写完整的文字3信息内容");
                    return;
                }
            }
            Bitmap bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            //创建 Graphics 对象,将pictureBox1作为背景图像进行内容的背景图像
            Graphics graphics = Graphics.FromImage(bitmap);

            ////添加一个白色画布
            //Rectangle Rec = new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height);
            //SolidBrush mySolidBrush = new SolidBrush(Color.White);
            //graphics.FillRectangle(mySolidBrush, Rec);

            //当条码内容部分数据不为空,界面显示条码
            if (!string.IsNullOrWhiteSpace(txt_QrCode.Text))
            {
                PointF DrawPoint = new PointF(Convert.ToInt32(txt_QrCodeX.Text), Convert.ToInt32(txt_QrCodeY.Text));
                //判断是否是一维码或者是二维码
                if (radioButton2.Checked)
                    CreateQRCode(graphics, DrawPoint, txt_QrCode.Text, Convert.ToInt32(txt_QrCodeWidth.Text), Convert.ToInt32(txt_QrCodeHeight.Text));
                else if (radioButton1.Checked)
                    CreateBrCode(graphics, DrawPoint, txt_QrCode.Text, Convert.ToInt32(txt_QrCodeWidth.Text), Convert.ToInt32(txt_QrCodeHeight.Text));
            }
            //当文字1内容部分数据不为空,界面显示内容1的数据
            if (!string.IsNullOrWhiteSpace(txt_Font1_Content.Text))
            {
                //创建 PointF 有序列类存储 float x,float y的数据(内容的坐标轴位置)
                PointF DrawPoint = new PointF(Convert.ToInt32(txt_Font1_X.Text), Convert.ToInt32(txt_Font1_Y.Text));
                AddFont(graphics, DrawPoint, txt_Font1_Content.Text, Convert.ToInt32(txt_Font1_Size.Text));
            }
            //当文字2内容部分数据不为空,界面显示内容1的数据
            if (!string.IsNullOrWhiteSpace(txt_Font2_Content.Text))
            {
                PointF DrawPoint = new PointF(Convert.ToInt32(txt_Font2_X.Text), Convert.ToInt32(txt_Font2_Y.Text));
                AddFont(graphics, DrawPoint, txt_Font2_Content.Text, Convert.ToInt32(txt_Font2_Size.Text));
            }
            //当文字3内容部分数据不为空,界面显示内容1的数据
            if (!string.IsNullOrWhiteSpace(txt_Font3_Content.Text))
            {
                PointF DrawPoint = new PointF(Convert.ToInt32(txt_Font3_X.Text), Convert.ToInt32(txt_Font3_Y.Text));
                AddFont(graphics, DrawPoint, txt_Font3_Content.Text, Convert.ToInt32(txt_Font3_Size.Text));
            }


            //刷新pictureBox1
            pictureBox1.Image = bitmap;
        }

3.在这里通过winform的按钮事件去清空界面,通过遍历窗体的内部控件元素,进行删除

        /// <summary>
        /// 清空姐界面内容
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //遍历整个窗体的元素
            foreach (Control item in this.Controls)
            {
                //如果是文本框
                if (item is TextBox)
                {
                    item.Text = null;
                }
                if (item is PictureBox)
                {
                    //方法一:
                    ((PictureBox)item).Image = null;

                    ////方法二:
                    ////清空picture内容
                    //Bitmap bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                    //Graphics graphics = Graphics.FromImage(bitmap);
                    ////添加一个透明画布
                    //Rectangle Rec = new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height);
                    //SolidBrush mySolidBrush = new SolidBrush(Color.Transparent);
                    //graphics.FillRectangle(mySolidBrush, Rec);
                    //((PictureBox)item).Image = bitmap;
                }
            }
        }

最后呈现结果