winform关于批量生二维码的做法

近期需要做一批二维码,网上的基本上是一个来生码,或者需要网络支持或者需要单个复制;

从网上找了个插件,编写了一组小代码,目前已经应用起来了;

主要功能:读取excel中的内容,生成png格式(RGB格式)二维码,然后再根据ps动作,生成需要印刷格式的tiff格式图片(CMYK格式)

使用的插件为ThoughtWorks.QRCode;可以自己从网上找dll,或者从nuGet中搜索均可;

1.把excel,表格建好,里面分别设置两列必须的内容例如内容二维码图片文件名;注意只读取Sheet1中的内容,如果想改名,可以在读取的方法中进行修改;

2.拖放excel到程序中,读取里面的两列内容;

3.根据两列内容生成对应的二维码内容;

上代码:

1.建立对应的Excel表格,在表格sheet1中设置对应的两列内容和二维码名称两列;下面设置填充对应的内容;

2.拖放实现内容读取:

分别给dataGridView添加两个方法:dataGridView1_DragEnter;dataGridView1_DragDrop;属性选择允许接收拖放;代码如下:

 private void dataGridView1_DragDrop(object sender, DragEventArgs e)
        {
            System.Array myarr = (System.Array)e.Data.GetData(DataFormats.FileDrop);
            System.Collections.IEnumerator myEnumerator = myarr.GetEnumerator();
            myEnumerator.MoveNext();
             string FileName = "";
            FileName = myEnumerator.Current.ToString(); ;
            dataGridView1.DataSource = GetExcelData("Sheet1", FileName);
            dataGridView1.DataMember = "Sheet1";// "[Sheet1$]";
                   
            for (int count = 0; (count <= (dataGridView1.Rows.Count - 1)); count++)
            {

                dataGridView1.Rows[count].HeaderCell.Value = (count + 1).ToString();

            }

            MessageBox.Show("共有" + (this.dataGridView1.Rows.Count).ToString() + "条信息");



        }

        private void dataGridView1_DragEnter(object sender, DragEventArgs e)
        {

            if (e.Data.GetDataPresent(DataFormats.FileDrop))
                e.Effect = DragDropEffects.Copy;
            else
                e.Effect = DragDropEffects.None;

        }

其中一个获取excel的方法单独提取出来了如下,只读取sheet1中内容;现在出来;

 public static DataSet GetExcelData(string strSheetName, string strExcelFileName)
        {
            string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strExcelFileName + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1;'";
            OleDbConnection myConn = new OleDbConnection(strCon);
            string strCom = string.Format("select * from [{0}$]", strSheetName);// " SELECT * FROM [Sheet1$]";
            DataSet myDataSet = new DataSet();
            try
            {
                myConn.Open();
                OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);

                myCommand.Fill(myDataSet, strSheetName);//"[Sheet1$]");

            }
            catch (Exception e)
            {
                //MessageBox.Show("表格中第一个表的名字必须是Sheet1!");
                throw e;
            }
            finally
            {
                myConn.Close();
            }


            return myDataSet;
        }

3.建立一个button设置对应的事件;

 private void button1_Click(object sender, EventArgs e)
        {
           //自定义的一个列表,用于生码使用
         impList.Clear();
        currentPath = Application.StartupPath + @"\"+DateTime.Now.ToString().Replace("\\","").Replace(" ","").Replace(":","").Replace("/","");
            Directory.CreateDirectory(currentPath);
            int error = 0;
            if (dataGridView1.Rows.Count > 0)
            {
                for (int j = 0; j < this.dataGridView1.Rows.Count; j++)//this.dataGridView1.Rows.Count
                {
                    string imgname = dataGridView1.Rows[j].Cells["二维码图片文件名"].Value.ToString().Trim() ?? dataGridView1.Rows[j].Cells["二维码图片文件名"].Value.ToString().Trim();
                    string urlstring = dataGridView1.Rows[j].Cells["内容"].Value.ToString().Trim() ?? dataGridView1.Rows[j].Cells["内容"].Value.ToString().Trim();

                    if (!String.IsNullOrEmpty(imgname)&&!String.IsNullOrEmpty(urlstring))
                    {
                        impList.Add(new Imgs() { url = urlstring, name = imgname });
                    }
                    else
                    {
                        error++;
                    }
                  
                }
                

                }else
	        {
                MessageBox.Show("没有数据生成");
	        }

        //图片需要的边距
            int padding=10;
            
            if (txpadding.Text != "10") { padding = int.Parse(txpadding.Text); }
            

                foreach (var item in impList)
	                {
       
                        Bitmap image = Create_ImgCode(item.url, padding);
                                //保存图片  
                                SaveImg(currentPath,item.name, image);
                                //打开文件夹  
	                }
  
                Open_File(currentPath);
                MessageBox.Show("共计生成:" + impList.Count() + "个二维码,有" + error.ToString()+"无效码");
           
        }

说明:如要内容1.读取excel中两列内容到imgList中;2.建立生码存放的地址currentPath;3.读取参数;4.生码然后保存,保存完后打开对应的目录;

上面生码Create_ImgCode代码如下:

     public Bitmap Create_ImgCode(string codeNumber,int padd=0 ,int size=10)  
        {
            int pad = padd;
                        
            //创建二维码生成类  
            QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();  
            //设置编码模式  
            qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;  
            //设置编码测量度  
            qrCodeEncoder.QRCodeScale = size;  //大小(值越大生成的二维码图片像素越高)
            //设置编码版本  
            qrCodeEncoder.QRCodeVersion = 0;  
            //设置编码错误纠正  
            qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;  
            //生成二维码图片  
            System.Drawing.Bitmap image = qrCodeEncoder.Encode(codeNumber,Encoding.UTF8);
  
             if (padd==0)
            {
                pad = image.Width / 30;
            }

                     //当目标图片尺寸大于二维码尺寸时,将二维码绘制在目标尺寸白色画布的中心位置
                      //新建空白绘图
            System.Drawing.Bitmap panel = new System.Drawing.Bitmap(image.Width + pad + pad, image.Width +pad+pad);
                         System.Drawing.Graphics graphic0 = System.Drawing.Graphics.FromImage(panel);
                        //bai--------------
                         graphic0.Clear(System.Drawing.Color.White);
                         int p_left = pad;
                         int p_top = pad;
                         

                         //将生成的二维码图像粘贴至绘图的中心位置
                         graphic0.DrawImage(image, p_left, p_top, image.Width, image.Height);
                         image = new System.Drawing.Bitmap(panel);
                         panel.Dispose();
                         panel = null;
                         graphic0.Dispose();
                         graphic0 = null;
                    
            return image;  
        }

其他方法可以借鉴的如下;

 /// <summary>
         /// 生成二维码
         /// </summary>
         /// <param name="Content">内容文本</param>
         /// <param name="QRCodeEncodeMode">二维码编码方式</param>
         /// <param name="QRCodeErrorCorrect">纠错码等级</param>
         /// <param name="QRCodeVersion">二维码版本号 0-40</param>
         /// <param name="QRCodeScale">每个小方格的预设宽度(像素),正整数</param>
         /// <param name="size">图片尺寸(像素),0表示不设置</param>
         /// <param name="border">图片白边(像素),当size大于0时有效</param>
         /// <returns></returns>
         public System.Drawing.Image CreateQRCode(string Content,   int size, int border)
         {
             QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();

             qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
             //设置编码测量度  
            // qrCodeEncoder.QRCodeScale = size;  //大小(值越大生成的二维码图片像素越高)
             //设置编码版本  
             qrCodeEncoder.QRCodeVersion = 7;
             //设置编码错误纠正  
             qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H;
             //生成二维码图片  


             qrCodeEncoder.QRCodeForegroundColor = Color.Black;// btnQRCodeForegroundColor.BackColor;//设置二维码前景色
             qrCodeEncoder.QRCodeBackgroundColor = Color.White;// btnQRCodeBackgroundColor.BackColor;//设置二维码背景色
       



             qrCodeEncoder.QRCodeScale =1;// QRCodeScale;
            
             System.Drawing.Image image = qrCodeEncoder.Encode(Content,Encoding.UTF8);

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

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

                 //如果目标尺寸大于生成的图片尺寸,则为图片增加白边
                 #region 如果目标尺寸大于生成的图片尺寸,则为图片增加白边
                 if (image.Width <= size)
                 {
                     //根据参数设置二维码图片白边的最小宽度
                     #region 根据参数设置二维码图片白边的最小宽度
                     if (border > 0)
                     {
                         while (image.Width <= size && size - image.Width < border * 2 && qrCodeEncoder.QRCodeScale > 1)
                         {
                             qrCodeEncoder.QRCodeScale--;
                             System.Drawing.Image imageNew = qrCodeEncoder.Encode(Content, Encoding.UTF8);
                             image = new System.Drawing.Bitmap(imageNew);
                             imageNew.Dispose();
                             imageNew = null;
                         }
                     }
                     #endregion

                     //当目标图片尺寸大于二维码尺寸时,将二维码绘制在目标尺寸白色画布的中心位置
                     if (image.Width < size)
                     {
                         //新建空白绘图
                         System.Drawing.Bitmap panel = new System.Drawing.Bitmap(size, size);
                         System.Drawing.Graphics graphic0 = System.Drawing.Graphics.FromImage(panel);
                        //bai--------------
                         graphic0.Clear(System.Drawing.Color.White);
                         int p_left = 0;
                         int p_top = 0;
                         if (image.Width <= size) //如果原图比目标形状宽
                         {
                             p_left = (size - image.Width) / 2;
                         }
                         if (image.Height <= size)
                         {
                             p_top = (size - image.Height) / 2;
                         }

                         //将生成的二维码图像粘贴至绘图的中心位置
                         graphic0.DrawImage(image, p_left, p_top, image.Width, image.Height);
                         image = new System.Drawing.Bitmap(panel);
                         panel.Dispose();
                         panel = null;
                         graphic0.Dispose();
                         graphic0 = null;
                     }
                 }
                 #endregion
             }
             #endregion
             return image;
         }

至此代码到此完成了;大家可以根据自己的想法再进行扩展;

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
使用WinForm摄像头扫描二维码,可以通过调用系统的摄像头设备来实现二维码的扫描功能。以下是一个简单的实现步骤: 1. 添加引用:在WinForm项目中,需要添加引用"System.Drawing"和"System.Windows.Forms"。 2. 设计界面:在WinForm窗口中,添加一个PictureBox用于显示摄像头捕获的图像并设置其大小和位置。 3. 初始化摄像头:在窗口加载事件中,实例化一个WebCamCapture对象,并将PictureBox控件传递给其构造函数进行初始化。 4. 捕获图像:通过调用WebCamCapture对象的Start方法,开始捕获摄像头的图像。可以通过Timer控件设置一个固定的时间间隔来周期性地调用WebCamCapture对象的Capture方法,将捕获的图像显示在PictureBox中。 5. 解析二维码:使用开源的ZXing库(可通过NuGet包管理器安装)来进行二维码的解析。在捕获到摄像头图像后,将其转换为Bitmap对象,然后使用ZXing库提供的BarcodeReader对象调用Decode方法对图像进行解析,将解析结果存储在Result对象中。 6. 显示结果:将解析结果在界面中显示出来,可以使用MessageBox或者Label控件来显示二维码中的内容。 需要注意的是,要使摄像头能够正常捕获图像,可能需要在项目的"应用程序"文件夹中添加相对路径为"\Resources"的"webcam.ico"图标文件,并在程序集信息中设置窗口的图标为该图标文件。 以上就是使用WinForm摄像头扫描二维码的简要步骤。具体实现可以根据自己的需求和项目的具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

因你而精彩_HAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值