C#調(diào)用halcon實現(xiàn)使用鼠標(biāo)滾輪對圖片進行縮放顯示
功能需求
我們在Winform的界面載入了圖片,希望使用鼠標(biāo)滾輪對圖片進行縮放顯示。
思路分享
鼠標(biāo)滾輪事件就是使用MouseWheel,然后根據(jù)事件的e.Delta屬性值的正負(fù)來區(qū)分是放大還是縮小操作,這一點比較清晰明朗,也較為簡單。
對圖片的縮放功能,我們很自然的就會想到使用halcon函數(shù)“zoom_image_factor”,但是當(dāng)我實際使用該函數(shù)后,發(fā)現(xiàn)經(jīng)過來回的幾次放大和縮小動作后,圖片已經(jīng)完全失真到模糊了。
所以我發(fā)現(xiàn)如果只是對圖片進行縮放顯示的話,重點應(yīng)該是“顯示”,而不是“圖片縮放”,應(yīng)該對顯示的窗口進行相應(yīng)的操作。最后我們用到的主要函數(shù)應(yīng)該是“HWindow.SetPart()”。
界面功能
這次我們是用的是“HSmartWindowControl”,我們可以直接用鼠標(biāo)在控件中對圖片進行拖動。
點擊“加載圖片”按鈕,將圖片載入顯示在HSmartWindowControl中。
鼠標(biāo)左鍵點擊圖片顯示控件,上下滑動鼠標(biāo)滾輪可以對圖片進行縮放顯示。
鼠標(biāo)右鍵點擊圖片顯示控件,會彈出“contextMenuStrip”,點擊“適中”會將圖片自適應(yīng)顯示在控件中。
代碼展示
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using HalconDotNet; namespace WindowsFormsApp8 { public partial class Form1 : Form { HWindow window; HImage image; String imagePath = @"..\..\image\apple_1.png"; public Form1() { InitializeComponent(); window = hWindowControl1.HalconWindow; image = new HImage(); this.hWindowControl1.MouseWheel += new MouseEventHandler(hWindowControl1_MouseWheel); //這里自己寫代碼綁定鼠標(biāo)滾輪事件,HMouseWheel事件好像不太管用 } private void hWindowControl1_MouseWheel(object sender, MouseEventArgs e) { //先獲得窗口相對于圖片的實際位置 window.GetPart(out int row1, out int col1, out int row2, out int col2); if (e.Delta > 0) { window.SetPart(row1 - 5, col1 - 5, row2 + 5, col2 + 5);//擴大窗口,縮小圖片顯示 } else { if (row1 + 5 < row2 - 5 && col1 + 5 < col2 - 5)//保證窗口可視 { window.SetPart(row1 + 5, col1 + 5, row2 - 5, col2 - 5);//縮小窗口,增強圖片細(xì)節(jié)顯示,類似于放大圖片 } } window.DispObj(image); } private void btn_loadimage_Click(object sender, EventArgs e) { image.ReadImage(imagePath); image.GetImageSize(out int width, out int height); window.DispObj(image); tb_width.Text = width.ToString(); tb_height.Text = height.ToString(); } private void hWindowControl1_HMouseDown(object sender, HMouseEventArgs e) { if (e.Button == MouseButtons.Right) { //右鍵彈出自定義菜單 contextMenuStrip1.Show(MousePosition.X, MousePosition.Y); } } private void 適中ToolStripMenuItem_Click(object sender, EventArgs e) { image.GetImageSize(out int width, out int height); window.SetPart(0, 0, height, width);//窗口適中顯示圖片 window.DispObj(image); } } }
鼠標(biāo)滾輪動作時,先使用“GetPart()”獲取當(dāng)前窗口左上角和右下角相對于原圖像的位置。
如果想縮小顯示,則需要將窗口左上角和右下角的相對位置遠(yuǎn)離,擴大窗口能看圖像更多內(nèi)容。
如果想放大顯示,則需要將窗口左上角和右下角的相對位置靠近(但是要保證左上角行列值小于右下角),縮小窗口能看到圖像更多細(xì)節(jié)。
至于縮放移動的像素距離,我這里設(shè)置的都是5,大家也可以根據(jù)圖像實際的寬高比例,將row和col縮放的變化值設(shè)置為相應(yīng)比例的兩個值。
到此這篇關(guān)于C#調(diào)用halcon實現(xiàn)使用鼠標(biāo)滾輪對圖片進行縮放顯示的文章就介紹到這了,更多相關(guān)C#圖片縮放顯示內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c#創(chuàng)建圓形類Circle、矩形類實現(xiàn)代碼
這篇文章主要介紹了c#創(chuàng)建圓形類Circle實現(xiàn)代碼,其中包括set,get方法,需要的朋友可以參考下2020-11-11C#如何安全、高效地玩轉(zhuǎn)任何種類的內(nèi)存之Span的本質(zhì)
為什么要使用指針,什么時候需要使用它,以及如何安全、高效地使用它?本文將講清楚 What、How 和 Why ,讓你知其然,更知其所以然2021-08-08C#使用Http Post方式傳遞Json數(shù)據(jù)字符串調(diào)用Web Service
這篇文章主要為大家詳細(xì)介紹了C#使用Http Post方式傳遞Json數(shù)據(jù)字符串調(diào)用Web Service,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08Extjs4如何處理后臺json數(shù)據(jù)中日期和時間
本文給大家分享Extjs4如何處理后臺json數(shù)據(jù)中日期和時間,通過代碼示例給大家剖析,感興趣的朋友快來圍觀2015-08-08