C#应用2——C#联合halcon缩放图像

https://blog.csdn.net/jgj123321/article/details/96479014

  private static HTuple WindowID, ImageWidth, ImageHeight;
        private static double RowDown;//鼠标按下时的行坐标
        private static double ColDown;//鼠标按下时的列坐标
       private static HObject ho_image;      //图像变量
        #region 创建Halcon窗口
        /// <summary>
        /// 创建Halcon窗口
        /// </summary>
        /// <param name="hWindowControl1"></param>
        public static void CreateHalconWindow(HWindowControl hWindowControl1)
        {
            /图片控件为halcon中的HWindowControl控件时/
            WindowID = hWindowControl1.HalconWindow;
        }
        #endregion
        #region 读图
        /// <summary>
        /// 读图
        /// </summary>
        public static void readImage()
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            //openFileDialog.Filter = "JPEG文件|*.jpg*|BMP文件|*.bmp*|TIFF文件|*.tiff*";
            openFileDialog.Filter = "所有图像文件 | *.bmp; *.pcx; *.png; *.jpg; *.gif;*.tif; *.ico; *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                HTuple ImagePath = openFileDialog.FileName;
                HOperatorSet.ReadImage(out ho_image, ImagePath);
            }
            HOperatorSet.GetImageSize(ho_image, out ImageWidth, out ImageHeight);
            HOperatorSet.SetPart(WindowID, 0, 0, ImageHeight, ImageWidth);
            HOperatorSet.DispObj(ho_image, WindowID);
        }
        #endregion
        #region 缩放图像
        /// <summary>
        /// 缩放图像
        /// </summary>
        public static void HMouseWheel()
        {
            HMouseEventArgs e = null;
            HTuple Zoom, Row, Col, Button;
            HTuple Row0, Column0, Row00, Column00, Ht, Wt, r1, c1, r2, c2;
            if (e.Delta > 0)
            {
                Zoom = 1.5;
            }
            else
            {
                Zoom = 0.5;
            }
            HOperatorSet.GetMposition(WindowID, out Row, out Col, out Button);
            HOperatorSet.GetPart(WindowID, out Row0, out Column0, out Row00, out Column00);
            Ht = Row00 - Row0;
            Wt = Column00 - Column0;
            if (Ht * Wt < 32000 * 32000 || Zoom == 1.5)//普通版halcon能处理的图像最大尺寸是32K*32K。如果无限缩小原图像,导致显示的图像超出限制,则会造成程序崩溃
            {
                r1 = (Row0 + ((1 - (1.0 / Zoom)) * (Row - Row0)));
                c1 = (Column0 + ((1 - (1.0 / Zoom)) * (Col - Column0)));
                r2 = r1 + (Ht / Zoom);
                c2 = c1 + (Wt / Zoom);
                HOperatorSet.SetPart(WindowID, r1, c1, r2, c2);
                HOperatorSet.ClearWindow(WindowID);
                HOperatorSet.DispObj(ho_image, WindowID);
            }
        }
        #endregion
        #region 鼠标按下,记录当前坐标值
        /// <summary>
        /// 鼠标按下,记录当前坐标值
        /// </summary>      
        public static void HMouseDown()
        {
            HTuple Row, Column, Button;
            HOperatorSet.GetMposition(WindowID, out Row, out Column, out Button);
            RowDown = Row;    //鼠标按下时的行坐标
            ColDown = Column; //鼠标按下时的列坐标
        }
        #endregion
        #region 鼠标抬起,实现图像移动
        /// <summary>
        /// 鼠标抬起,实现图像移动
        /// </summary>
        public static void HMouseUp()
        {
            HTuple row1, col1, row2, col2, Row, Column, Button;
            HOperatorSet.GetMposition(WindowID, out Row, out Column, out Button);
            double RowMove = Row - RowDown;   //鼠标弹起时的行坐标减去按下时的行坐标,得到行坐标的移动值
            double ColMove = Column - ColDown;//鼠标弹起时的列坐标减去按下时的列坐标,得到列坐标的移动值
            HOperatorSet.GetPart(WindowID, out row1, out col1, out row2, out col2);//得到当前的窗口坐标
            HOperatorSet.SetPart(WindowID, row1 - RowMove, col1 - ColMove, row2 - RowMove, col2 - ColMove);//这里可能有些不好理解。以左上角原点为参考点
            HOperatorSet.ClearWindow(WindowID);
            if (ImageHeight != null)
            {
                HOperatorSet.DispObj(ho_image, WindowID);
            }
            else
            {
                MessageBox.Show("请加载一张图片");
            }
        }
        #endregion
        #region 鼠标移动,实时显示当前坐标与灰度值
        /// <summary>
        /// 鼠标移动,实时显示当前坐标与灰度值
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public static void HMouseMove()
        {
            HTuple Row, Column, Button, pointGray;
            HOperatorSet.GetMposition(WindowID, out Row, out Column, out Button);              //获取当前鼠标的坐标值
            if (ImageHeight != null && (Row > 0 && Row < ImageHeight) && (Column > 0 && Column < ImageWidth))//设置3个条件项,防止程序崩溃。
            {
                HOperatorSet.GetGrayval(ho_image, Row, Column, out pointGray);                 //获取当前点的灰度值
            }
            else
            {
                pointGray = "_";
            }
            String str = String.Format("Row:{0}  Column:{1}  Gray:{2}", Row, Column, pointGray); //格式化字符串
 
        }
        #endregion
        #region 全屏显示图像,使缩放后的图像回到原始大小
        /// <summary>
        /// 全屏显示图像,使缩放后的图像回到原始大小
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public static void FullWindow_Click()
        {
            HOperatorSet.SetPart(WindowID, 0, 0, ImageHeight - 1, ImageWidth - 1);
            HOperatorSet.ClearWindow(WindowID);
            HOperatorSet.DispObj(ho_image, WindowID);
        }
        #endregion
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#联合Halcon图像缩放的过程中,可以采用不拉伸显示函数来实现自动适应。可以通过设置自动适应按钮的点击事件来调用相应的函数。例如,在点击自动适应按钮时,可以调用`ImgIsNotStretchDisplay`函数来实现图像的自适应显示。该函数可以接受Halcon图像Halcon窗口作为参数,然后在窗口显示适应大小的图像。\[2\] 此外,为了解决移动太快导致图像刷新闪烁的问题,可以使用鼠标按下和移动事件来实现图像的平滑移动。在鼠标按下事件中,可以保存鼠标按下时的坐标,然后在鼠标移动事件中计算鼠标移动的距离,并根据距离调整图像显示位置。这样可以避免图像刷新过快导致的闪烁问题。\[3\] 总结起来,要实现C#联合Halcon图像缩放,可以使用不拉伸显示函数来实现自动适应,并通过鼠标按下和移动事件来实现图像的平滑移动。这样可以提供更好的用户体验。 #### 引用[.reference_title] - *1* *2* *3* [C#halcon联合(2)缩放移动自适应图像,解决刷新闪烁,缩放崩溃问题](https://blog.csdn.net/adsd1233123/article/details/119272503)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值