Halcon控件圖像縮放


需要的變量定義

 private double RowDown;//鼠標按下時的行坐標
        private double ColDown;//鼠標按下時的列坐標
        HTuple Hmposition_Row, Hmposition_Col;
        HObject himg;
        HWindow hwin;
        bool bMouseDown = false;
        HTuple imgwidth, imgheight;

窗體加載事件讀取本地圖片,並適應Halcon控件大小

  private void Form1_Load(object sender, EventArgs e)
        {
            hwin = hWindowControl1.HalconWindow;
            HOperatorSet.ReadImage(out himg, AppDomain.CurrentDomain.BaseDirectory + "TP.bmp");
            HOperatorSet.GetImageSize(himg, out imgwidth, out imgheight);
            HOperatorSet.SetPart(hwin, 0, 0, imgheight, imgwidth);
            HOperatorSet.DispObj(himg, hwin);
        }

鼠標移動事件,實現圖像的平移(這里和鼠標右鍵按下松開事件配合實現)

 private void hWindowControl1_HMouseMove(object sender, HMouseEventArgs e)
        {
            try
            {
                HTuple Hbutton_state, Hpixelgraval;

                HTuple row1, col1, row2, col2; //Row, Column, Button;

                HOperatorSet.GetMposition(hwin, out Hmposition_Row, out Hmposition_Col, out Hbutton_state);
                if (Hmposition_Col < 0)
                {
                    Hmposition_Col = 0;
                }
                if (Hmposition_Col > imgwidth - 1)
                {
                    Hmposition_Col = imgwidth - 1;
                }
                if (Hmposition_Row < 0)
                {
                    Hmposition_Row = 0;
                }
                if (Hmposition_Row > imgheight - 1)
                {
                    Hmposition_Row = imgheight - 1;
                }

                HOperatorSet.GetGrayval(himg, Hmposition_Row, Hmposition_Col, out Hpixelgraval);
                // toolStripStatusLabel7.Text = "(" + Hmposition_Row.ToString() + "," + Hmposition_Col.ToString() + ")=" + Hpixelgraval.ToString();
                if (bMouseDown)
                {
                    double RowMove = Hmposition_Row - RowDown;   //鼠標彈起時的行坐標減去按下時的行坐標,得到行坐標的移動值
                    double ColMove = Hmposition_Col - ColDown;//鼠標彈起時的列坐標減去按下時的列坐標,得到列坐標的移動值
                    HOperatorSet.GetPart(hwin, out row1, out col1, out row2, out col2);//得到當前的窗口坐標
                    HOperatorSet.SetPart(hwin, row1 - RowMove, col1 - ColMove, row2 - RowMove, col2 - ColMove);//這里可能有些不好理解。以左上角原點為參考點
                    HOperatorSet.ClearWindow(hwin);
                    if (imgheight != null)
                    {
                        HOperatorSet.SetSystem("flush_graphic", "true");
                        HOperatorSet.DispObj(himg, hwin);
                        HOperatorSet.SetSystem("flush_graphic", "false");
                    }
                    else
                    {
                        MessageBox.Show("請加載一張圖片");
                    }
                }
            }
            catch { }
        }

鼠標滾輪事件,通過滾輪實現圖像的放大縮小

private void hWindowControl1_HMouseWheel(object sender, HMouseEventArgs e)
        {
            try
            {
                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(hwin, out Row, out Col, out Button);
                HOperatorSet.GetPart(hwin, 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(hwin, r1, c1, r2, c2);
                    HOperatorSet.ClearWindow(hwin);
                    HOperatorSet.SetSystem("flush_graphic", "true");
                    HOperatorSet.DispObj(himg, hwin);
                    HOperatorSet.SetSystem("flush_graphic", "false");
                }
            }
            catch { }
        }

鼠標松開事件

 private void hWindowControl1_HMouseUp(object sender, HMouseEventArgs e)
 {
            if (e.Button == MouseButtons.Right)
            {
                bMouseDown = false;
            }
 }

鼠標按下事件

private void hWindowControl1_HMouseDown(object sender, HMouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                bMouseDown = true;
                HTuple Row, Column, Button;
                HOperatorSet.GetMposition(hwin, out Row, out Column, out Button);
                RowDown = Row;    //鼠標按下時的行坐標
                ColDown = Column; //鼠標按下時的列坐標
            }
        } 

縮放后通過按鈕的點擊事件恢復圖像到適應Halcon控件的狀態

private void button1_Click(object sender, EventArgs e)
       {
           HOperatorSet.GetImageSize(himg, out imgwidth, out imgheight);
           HOperatorSet.SetPart(hwin, 0, 0, imgheight - 1, imgheight - 1);
           hwin.DispObj(himg);
       }

界面:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM