FrmCodeDecode.cs 12.8 KB

using CodeLibrary;
using HalconDotNet; 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace CodeLibrary
{
    public partial class FrmCodeDecode : FrmBase
    { 
        private Stopwatch stopwatch = new Stopwatch();

        private List<string> baslerNameList = new List<string>();
        private List<string> hikNameList = new List<string>();
        public FrmCodeDecode()
        {
            InitializeComponent();
        }
        private string selCamera = CodeResourceControl.GetString(CodeResourceControl.selCamera, "请先选择相机");
        private string selImage = CodeResourceControl.GetString(CodeResourceControl.selImage, "请先选择图片");
        private string title = CodeResourceControl.GetString(CodeResourceControl.title, "提示");
        private string imageIsNull = CodeResourceControl.GetString(CodeResourceControl.imageIsNull, "获取二维码图片为空");
        private string sureDelete = CodeResourceControl.GetString(CodeResourceControl.sureDelete, "确定删除文件:");
        private void FrmMain_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            cmbCount.Items.Clear();
            for (int i = 1; i <= 300; i++)
            {
                cmbCount.Items.Add(i);
            }
            cmbCount.SelectedIndex = 0;
            cmbCount.SelectedIndex = 0;
            LoadCamera();

            cmbCodeType.DataSource = HDCodeLearnHelper.codeTypeList;
            if (HDCodeLearnHelper.codeTypeList.Count > 0)
            {
                cmbCodeType.SelectedIndex = 0;
            }
            else
            {
                cmbCodeType.Items.Add("QR Code");
                cmbCodeType.SelectedIndex = 0;
            } 
        }
        private void LoadCamera()
        {
            string[] camerName = BaslerCamera.Instance.CameraName;
            baslerNameList.AddRange(camerName);
            cmbCamera.Items.Clear();
            foreach (string str in camerName)
            {
                cmbCamera.Items.Add(str);
            }

            camerName = HIKCamera.Instance.CameraName;
            hikNameList.AddRange(camerName);
            foreach (string str in camerName)
            {
                cmbCamera.Items.Add(str);
            }
            if (camerName.Length > 0)
            {
                cmbCamera.SelectedIndex = 0;
            }
        }
        private void btnSelImage_Click(object sender, EventArgs e)
        {
            System.Windows.Forms.OpenFileDialog openDialog = new System.Windows.Forms.OpenFileDialog();
            openDialog.Title = selImage;
            openDialog.Filter = "(*.jpg)|*.jpg|(*.png)|*.png|(*.bmp)|*.bmp";
            //openDialog.DefaultExt = "png";
            System.Windows.Forms.DialogResult result = openDialog.ShowDialog();
            if (result == System.Windows.Forms.DialogResult.Cancel)
            {
                return;
            }
            txtPath.Text = openDialog.FileName;
            string filename = txtPath.Text;
            if (string.IsNullOrEmpty(filename))
            {
                MessageBox.Show(imageIsNull);
            }
            pictureBox1.Image = null;
            //读取图片内容
            Image img = (Image)Image.FromFile(filename).Clone();
            pictureBox1.Image = img;
        }
         
        private void btnErZhi_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image == null || txtPath.Text.Equals(""))
            {
                MessageBox.Show(selImage,title,MessageBoxButtons.OK,MessageBoxIcon.Error);
                return;
            }
            Bitmap map = new Bitmap(pictureBox1.Image);
            Bitmap newMap = ImageHelper.ConvertTo1Bpp1(map);
            pictureBox1.Image = newMap;
        }
        private void btnGray_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image == null || txtPath.Text.Equals(""))
            {
                MessageBox.Show(selImage ,title, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            Bitmap map = new Bitmap(pictureBox1.Image);
            Bitmap newMap = ImageHelper.ToGray(map);
            pictureBox1.Image = newMap;
        }
      
         
        private void ShowCode(List<CodeInfo> list)
        {
            if (list.Count > 0)
            {
                txtResult.Text += "\r\n code list:";
                foreach (CodeInfo code in list)
                {
                    txtResult.Text += "\r\n" + ""+code.CodeType+" (X:" + code.X + ",Y:" + code.Y + ") " + code.CodeStr;
                }
            }
            else
            {
                txtResult.Text += "\r\n no code ";
            }
        }

        private void btnbarCode_Click(object sender, EventArgs e)
        { 
            if (pictureBox1.Image == null  )
            {
                MessageBox.Show(selImage ,title, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            int count = cmbCount.SelectedIndex  ;
            txtResult.Text = "";
            stopwatch.Restart();
            HDCodeHelper.HalconWindow = this.hWindowControl1.HalconWindow;
            Bitmap map = new Bitmap(pictureBox1.Image);
            List<CodeInfo> result = HDCodeHelper.DecodeBarCode(map);
            ShowCode(result);
            txtResult.Text += "\r\n elapsed time:" + stopwatch.Elapsed.ToString();
        }
        public void ShowImage(HObject ho_Image)
        {
            HTuple width, height;
            HOperatorSet.GetImageSize(ho_Image, out width, out height);

            int dWidth = (int)width.D;
            int dHeight = (int)height.D;
            this.hWindowControl1.HalconWindow.SetPart(0, 0, dHeight, dWidth);
            HOperatorSet.DispObj(ho_Image, hWindowControl1.HalconWindow);
        }

        private void btnLearn_Click(object sender, EventArgs e)
        {
            FrmCodeLearn frm = new FrmCodeLearn();
            frm.ShowDialog();
        }

        private void btnDCode_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image == null)
            {
                MessageBox.Show(selImage ,title, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            int count = cmbCount.SelectedIndex  ;
            txtResult.Text = "";
            stopwatch.Restart();

            Bitmap map = new Bitmap(pictureBox1.Image);
            HObject ho_image = HDCodeHelper.Bitmap2HObjectBpp24(map);

            txtResult.Text += "\r\n elapsed time:" + stopwatch.Elapsed.ToString();
            hWindowControl1.HalconWindow.SetPart(0, 0, map.Height, map.Width);
            HOperatorSet.DispObj(ho_image, hWindowControl1.HalconWindow);
            ShowImage(ho_image);
            HDCodeHelper.HalconWindow = this.hWindowControl1.HalconWindow;
            string codeParamPath = HDCodeHelper.GetCodeParamFilePath(cmbCodeType.Text);
            if (chbUseParam.Checked.Equals(false))
            {
                codeParamPath = "";
            }
            List<CodeInfo> codeList = new List<CodeInfo>();
            if (cmbCodeType.Text.ToLower().Equals("barcode"))
            {
                codeList = HDCodeHelper.DecodeBarCode(ho_image);
            }
            else
            {
                codeList = HDCodeHelper.DecodeCode(ho_image, count, codeParamPath, cmbCodeType.Text);
            }
            ShowCode(codeList);

            txtResult.Text += "\r\n elapsed time:" + stopwatch.Elapsed.ToString();
        }

        private void btnClearLog_Click(object sender, EventArgs e)
        {
            HDLogUtil.ClearLog();
            txtResult.Text = "";
        }
        private Bitmap GetCameraBitmap()
        {
            int index = cmbCamera.SelectedIndex;
            string camerName = cmbCamera.Text;
            if (index < 0)
            {
                MessageBox.Show(selCamera);
                return null;
            }
            if (baslerNameList.Contains(camerName))
            {
                BaslerCamera.Instance.Open(camerName);
                BaslerCamera.Instance.GrabOne();
                Bitmap bitmap = BaslerCamera.Instance.Image;
                BaslerCamera.Instance.Close();
                return bitmap;
            }
            else
            {
                HIKCamera.Instance.Open(camerName);
                HIKCamera.Instance.GrabOne();
                Bitmap bitmap = HIKCamera.Instance.Image;
                HIKCamera.Instance.Close();
                return bitmap;
            }
        }
        private void btnCameraImage_Click(object sender, EventArgs e)
        {
            Bitmap bitmap = GetCameraBitmap();
            if (bitmap != null)
            {
                HDLogUtil.info("从相机【" + cmbCamera.Text + "】获取到一张图片");
                pictureBox1.Image = bitmap;
                HObject hoImage = HDCodeHelper.Bitmap2HObjectBpp24(bitmap);
                HDCodeLearnHelper.DefaultImage = hoImage;
            }
             
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnLigth_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image == null || txtPath.Text.Equals(""))
            {
                MessageBox.Show(selImage ,title, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            Bitmap map = new Bitmap(pictureBox1.Image);
            Bitmap newMap = ImageHelper.KiLighten(map,10);
            pictureBox1.Image = newMap;
        }

        private void btnAn_Click(object sender, EventArgs e)
        {
            if (pictureBox1.Image == null || txtPath.Text.Equals(""))
            {
                MessageBox.Show(selImage ,title, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            Bitmap map = new Bitmap(pictureBox1.Image);
            Bitmap newMap = ImageHelper.KiLighten(map, -10);
            pictureBox1.Image = newMap;
        } 

        private void cmbCodeType_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbCodeType.SelectedIndex >= 0)
            {
                txtParamPath.Text = HDCodeHelper.GetCodeParamFilePath(cmbCodeType.Text);
            }
        }
        private System.Timers.Timer testTimer = new System.Timers.Timer();
        private int testCount = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            if (testTimer.Enabled)
            {
                HDLogUtil.info("停止扫码测试");
                testTimer.Stop();
            }
            else
            {
                HDLogUtil.info("开始扫码测试");
                testCount = 0;
                testTimer.Interval = 1000;
                testTimer.Elapsed += TestTimer_Elapsed;
                testTimer.AutoReset = true;
                testTimer.Start();
            }
        }

        private void TestTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            try { 
            if (pictureBox1.Image == null)
            {
           
                return;
            }
            int count = cmbCount.SelectedIndex  ;
            txtResult.Text = "";
            stopwatch.Restart();
                testCount++;
            Bitmap map = new Bitmap(pictureBox1.Image);
            HObject ho_image = HDCodeHelper.Bitmap2HObjectBpp24(map);

            txtResult.Text += "\r\n elapsed time:" + stopwatch.Elapsed.ToString();
            hWindowControl1.HalconWindow.SetPart(0, 0, map.Height, map.Width);
            HOperatorSet.DispObj(ho_image, hWindowControl1.HalconWindow);
            ShowImage(ho_image);
            HDCodeHelper.HalconWindow = this.hWindowControl1.HalconWindow;
            string codeParamPath = HDCodeHelper.GetCodeParamFilePath(cmbCodeType.Text);
            if (chbUseParam.Checked.Equals(false))
            {
                codeParamPath = "";
            }
            List<CodeInfo> codeList = new List<CodeInfo>();
            if (cmbCodeType.Text.ToLower().Equals("barcode"))
            {
                codeList = HDCodeHelper.DecodeBarCode(ho_image);
            }
            else
            {
                codeList = HDCodeHelper.DecodeCode(ho_image, count, codeParamPath, cmbCodeType.Text);
            }
            ShowCode(codeList);

            txtResult.Text += "\r\n elapsed time:" + stopwatch.Elapsed.ToString();
                HDLogUtil.info("第【"+testCount+"】次扫码测试结束");
            }
            catch(Exception ex)
            {
                HDLogUtil.error(ex.ToString());
            }
        }
    }
}