C#調(diào)用halcon實(shí)現(xiàn)使用鼠標(biāo)滾輪對(duì)圖片進(jìn)行縮放顯示
功能需求
我們?cè)赪inform的界面載入了圖片,希望使用鼠標(biāo)滾輪對(duì)圖片進(jìn)行縮放顯示。
思路分享
鼠標(biāo)滾輪事件就是使用MouseWheel,然后根據(jù)事件的e.Delta屬性值的正負(fù)來區(qū)分是放大還是縮小操作,這一點(diǎn)比較清晰明朗,也較為簡(jiǎn)單。
對(duì)圖片的縮放功能,我們很自然的就會(huì)想到使用halcon函數(shù)“zoom_image_factor”,但是當(dāng)我實(shí)際使用該函數(shù)后,發(fā)現(xiàn)經(jīng)過來回的幾次放大和縮小動(dòng)作后,圖片已經(jīng)完全失真到模糊了。
所以我發(fā)現(xiàn)如果只是對(duì)圖片進(jìn)行縮放顯示的話,重點(diǎn)應(yīng)該是“顯示”,而不是“圖片縮放”,應(yīng)該對(duì)顯示的窗口進(jìn)行相應(yīng)的操作。最后我們用到的主要函數(shù)應(yīng)該是“HWindow.SetPart()”。
界面功能

這次我們是用的是“HSmartWindowControl”,我們可以直接用鼠標(biāo)在控件中對(duì)圖片進(jìn)行拖動(dòng)。
點(diǎn)擊“加載圖片”按鈕,將圖片載入顯示在HSmartWindowControl中。
鼠標(biāo)左鍵點(diǎn)擊圖片顯示控件,上下滑動(dòng)鼠標(biāo)滾輪可以對(duì)圖片進(jìn)行縮放顯示。
鼠標(biāo)右鍵點(diǎn)擊圖片顯示控件,會(huì)彈出“contextMenuStrip”,點(diǎn)擊“適中”會(huì)將圖片自適應(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)
{
//先獲得窗口相對(duì)于圖片的實(shí)際位置
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);//擴(kuò)大窗口,縮小圖片顯示
}
else
{
if (row1 + 5 < row2 - 5 && col1 + 5 < col2 - 5)//保證窗口可視
{
window.SetPart(row1 + 5, col1 + 5, row2 - 5, col2 - 5);//縮小窗口,增強(qiáng)圖片細(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)滾輪動(dòng)作時(shí),先使用“GetPart()”獲取當(dāng)前窗口左上角和右下角相對(duì)于原圖像的位置。
如果想縮小顯示,則需要將窗口左上角和右下角的相對(duì)位置遠(yuǎn)離,擴(kuò)大窗口能看圖像更多內(nèi)容。
如果想放大顯示,則需要將窗口左上角和右下角的相對(duì)位置靠近(但是要保證左上角行列值小于右下角),縮小窗口能看到圖像更多細(xì)節(jié)。
至于縮放移動(dòng)的像素距離,我這里設(shè)置的都是5,大家也可以根據(jù)圖像實(shí)際的寬高比例,將row和col縮放的變化值設(shè)置為相應(yīng)比例的兩個(gè)值。
到此這篇關(guān)于C#調(diào)用halcon實(shí)現(xiàn)使用鼠標(biāo)滾輪對(duì)圖片進(jìn)行縮放顯示的文章就介紹到這了,更多相關(guān)C#圖片縮放顯示內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
WPF+ASP.NET?SignalR實(shí)現(xiàn)簡(jiǎn)易在線聊天功能的示例代碼
這篇文章將以一個(gè)簡(jiǎn)單的聊天示例,簡(jiǎn)述如何通過WPF+ASP.NET?SignalR實(shí)現(xiàn)消息后臺(tái)通知,僅供學(xué)習(xí)分享使用,如有不足之處,還請(qǐng)指正2022-09-09
c#中的interface abstract與virtual介紹
abstract 與virtual : 方法重寫時(shí)都使用 override 關(guān)鍵字,interface中的方法和abstract方法都要求實(shí)現(xiàn)2013-07-07
C#獲取當(dāng)前成員函數(shù)的函數(shù)名的幾種常用方法
本文介紹了在C#中獲取當(dāng)前成員函數(shù)名稱的幾種方法,包括反射、nameof、CallerMemberName、StackTrace和表達(dá)式樹,并給出了最佳實(shí)踐推薦,需要的朋友可以參考下2026-02-02
C#如何從byte[]中直接讀取Structure實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于利用C#如何從byte[]里直接讀取Structure的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
C#使用foreach語(yǔ)句遍歷堆棧(Stack)的方法
這篇文章主要介紹了C#使用foreach語(yǔ)句遍歷堆棧(Stack)的方法,涉及C#操作foreach實(shí)現(xiàn)遍歷堆棧的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
C#中判斷本地系統(tǒng)的網(wǎng)絡(luò)連接狀態(tài)的方法
C#中一般通過InternetGetConnectedState函數(shù)返回本地系統(tǒng)的網(wǎng)絡(luò)連接狀態(tài),下面簡(jiǎn)單介紹下,需要的朋友可以參考下2013-10-10

