C#调用halcon使用鼠标滚轮对图片进行缩放显示

功能需求

        我们在Winform的界面载入了图片,希望使用鼠标滚轮对图片进行缩放显示。

思路分享

        鼠标滚轮事件就是使用MouseWheel,然后根据事件的e.Delta属性值的正负来区分是放大还是缩小操作,这一点比较清晰明朗,也较为简单。

        对图片的缩放功能,我们很自然的就会想到使用halcon函数“zoom_image_factor”,但是当我实际使用该函数后,发现经过来回的几次放大和缩小动作后,图片已经完全失真到模糊了。

        所以我发现如果只是对图片进行缩放显示的话,重点应该是“显示”,而不是“图片缩放”,应该对显示的窗口进行相应的操作。最后我们用到的主要函数应该是“HWindow.SetPart()”。

界面功能

  1. 这次我们是用的是“HSmartWindowControl”,我们可以直接用鼠标在控件中对图片进行拖动。
  2. 点击“加载图片”按钮,将图片载入显示在HSmartWindowControl中。
  3. 鼠标左键点击图片显示控件,上下滑动鼠标滚轮可以对图片进行缩放显示。
  4. 鼠标右键点击图片显示控件,会弹出“contextMenuStrip”,点击“适中”会将图片自适应显示在控件中。

代码展示

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);
            //这里自己写代码绑定鼠标滚轮事件,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);//缩小窗口,增强图片细节显示,类似于放大图片
                }

            }

            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);
        }
    }
}
  1. 鼠标滚轮动作时,先使用“GetPart()”获取当前窗口左上角和右下角相对于原图像的位置。
  2. 如果想缩小显示,则需要将窗口左上角和右下角的相对位置远离,扩大窗口能看图像更多内容。
  3. 如果想放大显示,则需要将窗口左上角和右下角的相对位置靠近(但是要保证左上角行列值小于右下角),缩小窗口能看到图像更多细节。
  4. 至于缩放移动的像素距离,我这里设置的都是5,大家也可以根据图像实际的宽高比例,将row和col缩放的变化值设置为相应比例的两个值。

文末总结

        这个问题困扰了我很久,发现还是需要改变思路,这样问题才迎刃而解。希望本篇文章也能帮助到大家。

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C#调用Halcon引擎可以通过添加引用halcondotnet.dll和hdevenginedonet.dll来实现。以下是两种调用Halcon引擎的方法: 1. 在C#使用Halcon引擎调用Halcon程序 首先,需要在Halcon中导出C#文件,然后在C#调用。具体步骤如下: - 在Halcon中打开需要调用的程序。 - 选择“文件”->“导出”->“导出C#文件”。 - 在C#中添加对halcondotnet.dll和hdevenginedonet.dll的引用。 - 在C#中创建Halcon引擎实例并调用Halcon程序。 以下是一个示例代码: ```csharp using HalconDotNet; class Program { static void Main(string[] args) { // 创建Halcon引擎实例 HDevEngine engine = new HDevEngine(); engine.SetScriptPath("path/to/halcon/program"); // 调用Halcon程序 engine.ExecuteScript("halcon_program.cs"); } } ``` 2. 在C#使用Halcon引擎调用.hdev下本地函数或者.hdvp外部函数 在C#使用Halcon引擎调用.hdev下本地函数或者.hdvp外部函数也是通过添加引用halcondotnet.dll和hdevenginedonet.dll来实现。具体步骤如下: - 在C#中添加对halcondotnet.dll和hdevenginedonet.dll的引用。 - 在C#中创建Halcon引擎实例并调用.hdev下本地函数或者.hdvp外部函数。 以下是一个示例代码: ```csharp using HalconDotNet; class Program { static void Main(string[] args) { // 创建Halcon引擎实例 HDevEngine engine = new HDevEngine(); // 调用.hdev下本地函数 engine.CallProcedure("local_procedure"); // 调用.hdvp外部函数 engine.CallExternalProcedure("external_procedure", "path/to/external/procedure.hdvp"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花飞花落花满楼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值