设置首页收藏本站
开启左侧

C#开发Halcon实现缩放、平移功能代码

[复制链接]
绝地武士 发表于 2020-2-24 17:27:52 | 显示全部楼层 |阅读模式
  1. //缩放图像
  2.         private void hWindowControl1_HMouseWheel(object sender, HMouseEventArgs e)
  3.         {
  4.             HTuple Zoom, Row, Col, Button;
  5.             HTuple Row0, Column0, Row00, Column00, Ht, Wt, r1, c1, r2, c2;
  6.             if (e.Delta > 0)
  7.             {
  8.                 Zoom = 1.5;
  9.             }
  10.             else
  11.             {
  12.                 Zoom = 0.5;
  13.             }
  14.             HOperatorSet.GetMposition(WindowID, out Row, out Col, out Button);
  15.             HOperatorSet.GetPart(WindowID, out Row0, out Column0, out Row00, out Column00);
  16.             Ht = Row00 - Row0;
  17.             Wt = Column00 - Column0;
  18.             if (Ht * Wt < 32000 * 32000 || Zoom == 1.5)//普通版halcon能处理的图像最大尺寸是32K*32K。如果无限缩小原图像,导致显示的图像超出限制,则会造成程序崩溃
  19.             {
  20.                 r1 = (Row0 + ((1 - (1.0 / Zoom)) * (Row - Row0)));
  21.                 c1 = (Column0 + ((1 - (1.0 / Zoom)) * (Col - Column0)));
  22.                 r2 = r1 + (Ht / Zoom);
  23.                 c2 = c1 + (Wt / Zoom);
  24.                 HOperatorSet.SetPart(WindowID, r1, c1, r2, c2);
  25.                 HOperatorSet.ClearWindow(WindowID);
  26.                 HOperatorSet.DispObj(ho_image, WindowID);
  27.             }
  28.         }
  29.         //鼠标按下,记录当前坐标值
  30.         private void hWindowControl1_HMouseDown(object sender, HMouseEventArgs e)
  31.         {
  32.             HTuple Row, Column, Button;
  33.             HOperatorSet.GetMposition(WindowID, out Row, out Column, out Button);
  34.             RowDown = Row;    //鼠标按下时的行坐标
  35.             ColDown = Column; //鼠标按下时的列坐标
  36.         }
  37.         //鼠标抬起,实现图像移动
  38.         private void hWindowControl1_HMouseUp(object sender, HMouseEventArgs e)
  39.         {
  40.             HTuple row1, col1, row2, col2,Row, Column, Button;
  41.             HOperatorSet.GetMposition(WindowID, out Row, out Column, out Button);
  42.             double RowMove = Row - RowDown;   //鼠标弹起时的行坐标减去按下时的行坐标,得到行坐标的移动值
  43.             double ColMove = Column - ColDown;//鼠标弹起时的列坐标减去按下时的列坐标,得到列坐标的移动值
  44.             HOperatorSet.GetPart(WindowID, out row1, out col1, out row2, out col2);//得到当前的窗口坐标
  45.             HOperatorSet.SetPart(WindowID, row1 - RowMove, col1 - ColMove, row2 - RowMove, col2 - ColMove);//这里可能有些不好理解。以左上角原点为参考点
  46.             HOperatorSet.ClearWindow(WindowID);
  47.             if (ImageHeight != null)
  48.             {
  49.                 HOperatorSet.DispObj(ho_image, WindowID);
  50.             }
  51.             else
  52.             {
  53.                 MessageBox.Show("请加载一张图片");
  54.             }      
  55.         }
  56.         //鼠标移动,实时显示当前坐标与灰度值
  57.         private void hWindowControl1_HMouseMove(object sender, HMouseEventArgs e)
  58.         {
  59.             HTuple Row, Column, Button, pointGray;
  60.             HOperatorSet.GetMposition(WindowID, out Row, out Column, out Button);              //获取当前鼠标的坐标值
  61.             if (ImageHeight != null && (Row > 0 && Row < ImageHeight) && (Column > 0 && Column < ImageWidth))//设置3个条件项,防止程序崩溃。
  62.             {
  63.                 HOperatorSet.GetGrayval(ho_image, Row, Column, out pointGray);                 //获取当前点的灰度值
  64.             }
  65.             else
  66.             {
  67.                 pointGray = "_";
  68.             }
  69.             String str = String.Format("Row:{0}  Column:{1}  Gray:{2}", Row, Column, pointGray); //格式化字符串
  70.             label1.Text = str;                                                                   //在label控件上显示数值        
  71.         }
  72.         //全屏显示图像,使缩放后的图像回到原始大小
  73.         private void button_FullWindow_Click(object sender, EventArgs e)
  74.         {
  75.             HOperatorSet.SetPart(WindowID, 0, 0, ImageHeight - 1, ImageWidth - 1);
  76.             HOperatorSet.ClearWindow(WindowID);
  77.             HOperatorSet.DispObj(ho_image, WindowID);
  78.         }
复制代码

网上找的代码,说实话上面这个代码是一般般,建议把再添加一个控件的MOVE方法,可以实现滚轮缩放,按住鼠标移动就拖拽,不像上面这个代码一样一卡一卡再显示!
出现闪烁的话,在ClearWindow之前设置
  1. HOperatorSet.SetSystem("flush_graphic", "false");
复制代码

清除窗口后再重新打开
  1. HOperatorSet.SetSystem("flush_graphic", "true");
复制代码

奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
RockKin 发表于 2020-12-28 18:21:42 | 显示全部楼层
进不去滚轮事件啊  hWindowControl1_HMouseWheel ,,点击什么的都能进就是这个进不了
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
RockKin 发表于 2020-12-28 18:22:42 | 显示全部楼层
RockKin 发表于 2020-12-28 18:21
进不去滚轮事件啊  hWindowControl1_HMouseWheel ,,点击什么的都能进就是这个进不了 ...

我用的是smartControl
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表