行远-自迩

导航

图像显示

HWindowControl控件图像显示:适应窗口,放大,缩放,平移

  • 适应窗口

 1  public void ImageFitWindow(HImage hImage, HWindowControl hwindow)
 2         {
 3             HTuple width, height;
 4             hImage.GetImageSize(out width, out height);
 5             double ratioWidth = 1.0 * width.I / hwindow.WindowSize.Width;
 6             double ratioHeight = 1.0 * height / hwindow.WindowSize.Height;
 7 
 8             HTuple row1, column1, row2, column2;
 9 
10             if (ratioWidth > ratioHeight)
11             {
12                 row1 = -(1.0) * (hwindow.WindowSize.Height * ratioWidth - height.I) / 2;
13                 column1 = 0;
14                 row2 = row1 + hwindow.WindowSize.Height * ratioWidth;
15                 column2 = column1 + hwindow.WindowSize.Width * ratioWidth;
16             }
17             else
18             {
19                 row1 = 0;
20                 column1 = -(1.0) * (hwindow.WindowSize.Width * ratioHeight - height.I) / 2;
21                 row2 = row1 + hwindow.WindowSize.Height * ratioHeight;
22                 column2 = column1 + hwindow.WindowSize.Width * ratioHeight;
23 
24             }
25           //  hwindow.HalconWindow.SetPart(row1, column1, row2, column2);
26                HOperatorSet.SetPart(hwindow.HalconWindow, row1, column1, row2, column2);
27             hwindow.HalconWindow.DispObj(hImage);
28         }
  • 放大,缩放,平移

借助鼠标事件实现

 1 public  class MouseEvent
 2     {
 3         private HTuple WindowID;
 4         private double RowDown;//鼠标按下时的行坐标
 5         private double ColDown;//鼠标按下时的列坐标
 6         private HObject hImage;
 7         HTuple ImageWidth, ImageHeight;
 8         public MouseEvent(HWindowControl hWindowControl,HObject hImage)
 9         {
10             this.WindowID = hWindowControl.HalconWindow;
11             if (hImage == null)
12                 return;
13             this.hImage = hImage;
14             HOperatorSet.GetImageSize(hImage,out ImageWidth,out ImageHeight);
15             hWindowControl.HMouseDown += new HMouseEventHandler(hWindowControl1_HMouseDown);
16             hWindowControl.HMouseUp += new HMouseEventHandler(hWindowControl1_HMouseUp);
17             hWindowControl.HMouseWheel += new HMouseEventHandler(hWindowControl1_HMouseWheel);
18             hWindowControl.HMouseMove += new HMouseEventHandler(hWindowControl1_HMouseMove);
19         }
20         //鼠标按下,记录当前坐标值
21         private void hWindowControl1_HMouseDown(object sender,HMouseEventArgs e)
22         {
23             HTuple Row, Column, Button;
24             HOperatorSet.GetMposition(WindowID, out Row,out Column, out Button);
25             RowDown = Row;    //鼠标按下时的行坐标
26             ColDown = Column; //鼠标按下时的列坐标
27         }
28         private void hWindowControl1_HMouseUp(object sender,HMouseEventArgs e)
29         {
30             HTuple row1, col1, row2, col2, Row, Column, Button;
31             HOperatorSet.GetMposition(WindowID, out Row, out Column, out Button);
32             double RowMove = Row - RowDown;   //鼠标弹起时的行坐标减去按下时的行坐标,得到行坐标的移动值
33             double ColMove = Column - ColDown;//鼠标弹起时的列坐标减去按下时的列坐标,得到列坐标的移动值
34             HOperatorSet.GetPart(WindowID, out row1, out col1, out row2, out col2);//得到当前的窗口坐标
35             HOperatorSet.SetPart(WindowID, row1 - RowMove, col1 - ColMove, row2 - RowMove, col2 - ColMove);//这里可能有些不好理解。以左上角原点为参考点
36             HOperatorSet.ClearWindow(WindowID);
37             HOperatorSet.DispObj(hImage, WindowID);
38         }
39         private void hWindowControl1_HMouseWheel(object sender, HMouseEventArgs e)
40         {
41 
42             HTuple Zoom, Row, Col, Button;
43             HTuple Row0, Column0, Row00, Column00, Ht, Wt, r1, c1, r2, c2;
44             if (e.Delta > 0)
45             {
46                 Zoom = 1.5;
47             }
48             else
49             {
50                 Zoom = 0.5;
51             }
52             HOperatorSet.GetMposition(WindowID, out Row, out Col, out Button);
53             HOperatorSet.GetPart(WindowID, out Row0, out Column0, out Row00, out Column00);
54             Ht = Row00 - Row0;
55             Wt = Column00 - Column0;
56             if (Ht * Wt < 32000 * 32000 || Zoom == 1.5)//普通版halcon能处理的图像最大尺寸是32K*32K。如果无限缩小原图像,导致显示的图像超出限制,则会造成程序崩溃
57             {
58                 r1 = (Row0 + ((1 - (1.0 / Zoom)) * (Row - Row0)));
59                 c1 = (Column0 + ((1 - (1.0 / Zoom)) * (Col - Column0)));
60                 r2 = r1 + (Ht / Zoom);
61                 c2 = c1 + (Wt / Zoom);
62                 HOperatorSet.SetPart(WindowID, r1, c1, r2, c2);
63                 HOperatorSet.ClearWindow(WindowID);
64                 HOperatorSet.DispObj(hImage, WindowID);
65             }
66         }
67         private void hWindowControl1_HMouseMove(object sender, HMouseEventArgs e)
68         {
69 
70             HTuple Row, Column, Button, pointGray;
71             HOperatorSet.GetMposition(WindowID, out Row, out Column, out Button);              //获取当前鼠标的坐标值
72             if (ImageHeight != null && (Row > 0 && Row < ImageHeight) && (Column > 0 && Column < ImageWidth))//设置3个条件项,防止程序崩溃。
73             {
74                 HOperatorSet.GetGrayval(hImage, Row, Column, out pointGray);                 //获取当前点的灰度值
75             }
76             else
77             {
78                 pointGray = "_";
79             }
80 
81         }
82     }
  • 网上找文件

        这个文件更智能化,类似于康耐视图像显示窗口控件

        https://files.cnblogs.com/files/xingyuanzier/HWindow_Tool.zip?t=1649323448

posted on 2022-04-07 17:27  行远-自迩  阅读(150)  评论(0编辑  收藏  举报