首页 > 编程语言 >【C#】WPF实现HaIcon图像缩放、移动

【C#】WPF实现HaIcon图像缩放、移动

时间:2024-08-02 16:07:50浏览次数:12  
标签:ExpDefaultWinHandle HOperatorSet 鼠标 缩放 HaIcon void hv C# out

1.HaIcon实现的C#代码

//
//  File generated by HDevelop for HALCON/DOTNET (C#) Version 12.0
//
//  This file is intended to be used with the HDevelopTemplate or
//  HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c#

using System;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using HalconDotNet;

public partial class HalconImageHandle
{
    HTuple? hv_ExpDefaultWinHandle, RowDown, ColDown;
    HObject? ho_Image;
    bool isMouseDown = false;

    /// <summary>
    /// 鼠标按下
    /// </summary>
    public void MouseDown()
    {
        try
        {
            HTuple Row, Column, Button;
            //返回鼠标当前按下点的图像坐标
            HOperatorSet.GetMposition(hv_ExpDefaultWinHandle, out Row, out Column, out Button);
            RowDown = Row;    //鼠标按下时的行坐标
            ColDown = Column; //鼠标按下时的列坐标
            if (Button.I == 1)//左键嗯下值为1
                isMouseDown = true;
        }
        catch (Exception)
        {

            throw;
        }
    }

    /// <summary>
    /// 鼠标提起
    /// </summary>
    public void MouseUp()
    {
        try
        {
            if (isMouseDown)
            {
                isMouseDown = false;
            }
        }
        catch (Exception)
        {
        }
    }

    /// <summary>
    /// 移动
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    public void imagetrans()
    {
        try
        {
            if (!isMouseDown)
            {
                return;
            }
            HTuple Row, Column, Button;
            //获取当前鼠标的坐标值
            HOperatorSet.GetMposition(hv_ExpDefaultWinHandle, out Row, out Column, out Button);
            double RowMove = Row - RowDown;   //鼠标弹起时的行坐标减去按下时的行坐标,得到行坐标的移动值
            double ColMove = Column - ColDown;//鼠标弹起时的列坐标减去按下时的列坐标,得到列坐标的移动值
            HTuple row1, col1, row2, col2;

            //得到当前的窗口坐标
            HOperatorSet.GetPart(hv_ExpDefaultWinHandle, out row1, out col1, out row2, out col2);
            //移动后的左上角和右下角坐标,这里可能有些不好理解。以左上角原点为参考点
            HOperatorSet.SetPart(hv_ExpDefaultWinHandle, row1 - RowMove, col1 - ColMove, row2 - RowMove, col2 - ColMove);

            HOperatorSet.ClearWindow(hv_ExpDefaultWinHandle);
            HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
        }
        catch (Exception)
        {

            throw;
        }
    }

    /// <summary>
    /// 缩放
    /// </summary>
    /// <param name="Zoom"></param>
    public void imagescale(HTuple Zoom)
    {
        try
        {
            //放大倍数,当前鼠标选择的图像点坐标Row, Col,按下鼠标的左键还是右键:o-没按下,1-左键,2-中键,4-右键
            HTuple Row, Col, Button;
            HTuple RowLeftUpper, ColumnLeftUpper, RowRightLower, ColumnRightLower, Ht, Wt, ImagePartRowLeftUp, ImagePartColLeftUp, ImagePartRowRightLow, ImagePartColRightLow;
            //返回输出窗口中鼠标指针和鼠标按钮所按下的像素精确图像坐标,输出当前鼠标指针点的图像坐标以及按下的是鼠标左键还是右键,0是鼠标左键
            HOperatorSet.GetMposition(hv_ExpDefaultWinHandle, out Row, out Col, out Button);
            //Get part返回窗口中显示的图像部分的左上角和右下角

            //得到当前的窗口坐标,Row0:图像部分左上角的行索引,Column0:图像部分左上角的列索引,Row00:图像部分右下角的行索引,Column00:图像部分右下角的列索引
            HOperatorSet.GetPart(hv_ExpDefaultWinHandle, out RowLeftUpper, out ColumnLeftUpper, out RowRightLower, out ColumnRightLower);
            //显示的部分图像的高
            Ht = RowRightLower - RowLeftUpper;
            //显示的部分图像的宽
            Wt = ColumnRightLower - ColumnLeftUpper;
            //普通版halcon能处理的图像最大尺寸是32K*32K。如果无限缩小原图像,导致显示的图像超出限制,则会造成程序崩溃
            if (Ht * Wt < 32000 * 32000 || Zoom == 1.5)
            {
                //显示的放大或者缩小部分图像的左上角和右下角坐标
                ImagePartRowLeftUp = (RowLeftUpper + ((1 - (1.0 / Zoom)) * (Row - RowLeftUpper)));
                ImagePartColLeftUp = (ColumnLeftUpper + ((1 - (1.0 / Zoom)) * (Col - ColumnLeftUpper)));
                ImagePartRowRightLow = ImagePartRowLeftUp + (Ht / Zoom);
                ImagePartColRightLow = ImagePartColLeftUp + (Wt / Zoom);
                //设置部分显示图像
                HOperatorSet.SetPart(hv_ExpDefaultWinHandle, ImagePartRowLeftUp, ImagePartColLeftUp, ImagePartRowRightLow, ImagePartColRightLow);
                HOperatorSet.ClearWindow(hv_ExpDefaultWinHandle);
                HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
            }
        }
        catch (Exception)
        {

            throw;
        }
    }

    // Main procedure 
    private void action(String filePath)
    {
        HOperatorSet.GenEmptyObj(out ho_Image);
        HOperatorSet.ReadImage(out ho_Image, filePath);
        HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
    }

    public void InitHalcon()
    {
        // Default settings used in HDevelop 
        HOperatorSet.SetSystem("width", 512);
        HOperatorSet.SetSystem("height", 512);
    }

    public void RunHalcon(HTuple Window, String filePath)
    {
        hv_ExpDefaultWinHandle = Window;
        action(filePath);
    }

    public void Dispose()
    {
        ho_Image?.Dispose();
    }
}

2.WPF实现
2.1控件引用

<halcon:HWindowControlWPF
    x:Name="HW_Gerber"
    Grid.Row="1"
    Grid.Column="0"
    Grid.ColumnSpan="2"
    Margin="1,0,1,1"
    HMouseDown="HW_Gerber_HMouseDown"
    HMouseMove="HW_Gerber_HMouseMove"
    HMouseUp="HW_Gerber_HMouseUp"
    HMouseWheel="HW_Gerber_HMouseWheel" />

2.2后台cs实现

private void HW_Gerber_HMouseDown(object sender, HMouseEventArgsWPF e)
{
    try
    {
        boardTestImageViewModel?.MouseDown();
    }
    catch (Exception)
    {
    }
}

private void HW_Gerber_HMouseMove(object sender, HMouseEventArgsWPF e)
{
    try
    {
        boardTestImageViewModel?.MouseMove();
    }
    catch (Exception)
    {
    }
}

private void HW_Gerber_HMouseWheel(object sender, HMouseEventArgsWPF e)
{
    try
    {
        HTuple Zoom;
        //鼠标向上滚动表示放大
        if (e.Delta > 0)
        {
            Zoom = 1.2;
        }
        //向下滚动缩小
        else
        {
            Zoom = 0.8;
        }
        boardTestImageViewModel?.MouseWheel(Zoom);

    }
    catch (Exception)
    {
    }
}

private void HW_Gerber_HMouseUp(object sender, HMouseEventArgsWPF e)
{
    boardTestImageViewModel?.MouseUp();
}

2.3后台viewmodel实现

HalconImageHandle imageHandle = new HalconImageHandle();
/// <summary>
 /// 加载图像
 /// </summary>
 /// <param name="fileName"></param>
 private void LoadImage(string fileName)
 {
     Task.Factory.StartNew(() =>
     {
         Thread.Sleep(1000);
         string filePath = Path.Combine(DirPath, fileName);
         imageHandle.RunHalcon(page?.HW_Gerber.HalconWindow, filePath);
     });
 }

 /// <summary>
 /// 图像缩放
 /// </summary>
 /// <param name="Zoom"></param>
 public void MouseWheel(HTuple Zoom)
 {
     imageHandle.imagescale(Zoom);
 }
   
 /// <summary>
 /// 鼠标移动
 /// </summary>
 public void MouseMove()
 {
     imageHandle.imagetrans();
 }

 /// <summary>
 /// 鼠标按下
 /// </summary>
 public void MouseDown()
 {
     imageHandle.MouseDown();
 }

 /// <summary>
 /// 鼠标放开
 /// </summary>
 public void MouseUp()
 {
     imageHandle.MouseUp();
 }

标签:ExpDefaultWinHandle,HOperatorSet,鼠标,缩放,HaIcon,void,hv,C#,out
From: https://www.cnblogs.com/qiutian-hao/p/18338957

相关文章

  • conda环境使用
    创建名为new_env的conda环境,python版本号自定义:condacreate-nnew_envpython=3.9Anaconda创建虚拟环境失败解决办法,详见参考资料[2]:创建condarc文件(在C:\Users\xjl):condaconfig--addchannelsr将此文件内容替换为:channels:http://mirrors.tuna.tsinghua.edu.cn/anacon......
  • InvalidDimensionException:嵌入维度 384 与集合维度 3 不匹配
    我尝试在ChromaDB上使用语义搜索方法,然后出现错误“InvalidDimensionException:嵌入维度384与集合维度3不匹配”我的文件没有任何问题,供您参考,该文件是.CSV并且它已经有嵌入。我尝试使用以下代码执行语义搜索方法:fromchromadb.configimportSettingsfromchrom......
  • 【C++】学习笔记——智能指针
    文章目录二十一、智能指针1.内存泄漏2.智能指针的使用及原理RAII智能指针的原理auto_ptrunique_ptrshared_ptrshared_ptr的循环引用weak_ptr删除器未完待续二十一、智能指针1.内存泄漏在上一章的异常中,我们了解到如果出现了异常,会中断执行流,跳转到catch处。但......
  • 【C++】学习笔记——特殊类的设计
    文章目录二十二、特殊类的设计1.请设计一个类,不能被拷贝2.请设计一个类,只能在堆上创建对象3.请设计一个类,只能在栈上创建对象4.请设计一个类,不能被继承5.请设计一个类,只能创建一个对象(单例模式)未完待续二十二、特殊类的设计1.请设计一个类,不能被拷贝拷贝......
  • 【C++庖丁解牛】C++特殊类设计 | 单例模式
    ......
  • 文心快码 Baidu Comate全新交互形态,「#」is all you need,更多上下文理解、更详细的分
    用『#』将你的代码文件融入到对话中,再也不会出现内容和期望不符的“幻觉”了!想给当前文件所有函数添加注释?结果还需要一个个点击按钮生成?费时费力?----->『#」当前文件,给所有函数添加注释!想更改某个脚本文件的逻辑?结果还需要手动复制所有脚本,然后再写出自己的诉求?----->「#......
  • Oracle处理时间戳和时间格式的日期
    一、将时间格式转换为时间戳格式select(to_date('2024-08-0215:00:00','yyyy-mm-ddhh24:mi:ss')-to_date('1970-01-0108:00:00','yyyy-mm-ddhh24:mi:ss'))*24*60*60*1000AStimestampsfromdual;--1722582000000二、将时间戳格式......
  • cesium 点聚合
    撒点功能是gis项目中,最常用的功能。如果点位比较密集,就会出现点位图标重叠问题,如果点位过多,会影响绘制的性能,就会导致页面出现卡顿等问题。点聚合是一种比较好的解决方式。本篇对Entity图元的点聚合进行封装,在数据量不是太大的情况下,可以取得比较好的显示效果,如果数据量比较大,......
  • 最强代码问答来袭!Ask Comate Not Me!
    相信一直使用文心快码BaiduComate的同学已经察觉到了“侧边栏好像变得不一样了?”没错!文心快码BaiduComate侧边栏2.0来啦!新年新气象,侧边栏也要新!侧边栏现在的功能?基于文心大模型和飞桨能力,可以在侧边栏技术问答区域通过自然语言生成代码。你可以在这里问任何想问的......
  • Pytorch笔记|小土堆|P10-13|transforms
    transforms对图像进行改造最靠谱的办法:根据help文件自行学习transforms包含哪些工具(类)以及如何使用————————————————————————————————————自学一个类时,应关注:1、如何使用各种工具(类)的使用思路:创建对象(实例化)——>传入参数,调用函数(如有__......