FrmCodeDecode.cs 14.0 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;*.png;*.bmp)|*.jpg;*.png;*.bmp";
        //    openDialog.Filter = "All Supported Images (*.bmp;*.dib;*.rle;*.gif;*.jpg;*.png)|*.bmp;*.dib;*.rle;*.gif;*.jpg;*.png|Bitmaps (*.bmp;*.dib;*.rle)|*.bmp;*.dib;*.rle|Graphics Interchange Format (*.gif)|*.gif|Joint Photographic Experts (*.jpg)|*.jpg|Portable Network Graphics (*.png)|*.png|All Files (*.*)|*.*";
            //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);
            if (chbZxing.Checked)
            {
                zxingDecode(map, "barcode");
            }
            else
            {
                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 = "";
            }
            if (chbZxing.Checked)
            { 
                zxingDecode(map, cmbCodeType.Text);
            }
            else
            {
                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);
                }

                if (codeList.Count <= 0)
                {
                    zxingDecode(map, cmbCodeType.Text);
                }
                else
                {
                    ShowCode(codeList);
                    txtResult.Text += "\r\n elapsed time:" + stopwatch.Elapsed.ToString();
                }
            }
        }
        private void zxingDecode(Bitmap map,string type )
        {
            List<string> results = ZXingCodeHelper.DeCodes(map, type);

            txtResult.Text = " zxing decode:";
            foreach (string code in results)
            {
                txtResult.Text += "\r\n" + "\r\n" + code;
            }
            txtResult.Text += "\r\n \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());
            }
        }
    }
}