寫在前面,在較高的版本中有提供一個更好的顯示控件 HSmartWindowControl 。
• 縮放時,將鼠標的當前位置作為縮放的中心
• 移動時,修改圖像的原點即可
使用 Halcon 中 HWindowControl 控件的 ImagePart 來實現圖像縮放。
ImagePart 指示的是要在 HWindowControl 的窗體中顯示圖像的哪個部分。
首先 HWindowControl 控件的尺寸是固定的,當我們在這個固定的尺寸中,相對原來顯示的一幅完整的圖像,現在只顯示圖像的一部分,即可達到放大效果。
即想放大時,我們便縮小 ImagePart ;想縮小時,我們便放大 ImagePart 。
例如:一幅 800*600 的圖像,
一開始我們將 ImagePart 設置為 (0, 0) -> (800*600) ;
現在我們將其設置為 (0, 0) -> (400, 300) ,
之前用整幅圖像去填充 HWindowControl 控件,現在用半幅圖像去填充它,顯然這部分圖像就會被放大。放大的倍數是 2 。
現在可以縮放了,再看看如何實現以鼠標的當前位置作為中心,進行縮放?
要保證鼠標中心位置,即保證鼠標所指的圖像相對位置不變即可。
首先,假設圖像的寬度為 Width ,圖像的高度為 Height ,縮放比例為 Scale 。
那么,顯然初始狀態時 ImagePart 的寬度為 Width, 高度為 Height ;
縮放后 ImagePart 的寬度為 Width * ( Scale / 1 ) , 高度為 Height * ( Scale / 1 )
OK , 再假設縮放前鼠標的坐標為 ( X, Y ) , ImagePart 的起始坐標為 ( X0, Y0 ) , 終點坐標為 (X1, Y1) 。
那么,鼠標的相對坐標為 ( (X - X0) / (X1 - X0) * 100%, (Y - Y0) / (Y1 - Y0) * 100% )
那么,相對坐標 乘以 縮放后的大小,即可得到縮放后的鼠標坐標。
那么,縮放前鼠標坐標 減去 縮放后鼠標坐標 得到 縮放后 ImagePart 的起始坐標;
那么,縮放后 ImagePart 的起始坐標 加上 縮放后圖像的大小,即可得到縮放后 ImagePart 的終點坐標。
最后,調用 HWindowControl.ImagePart() , 即可實現縮放功能。
其實,假如理解了圖像的縮放,圖像的移動就簡單多了,只需先記錄下初始 ImagePart 的起點和終點坐標,初始鼠標坐標,移動過程中根據 當前鼠標坐標 減去 初始鼠標坐標 ,即可得到移動后的 ImagePart 的起點和終點坐標。