【C# Winform】 Action事件驱动的多层数据传递
目录
一、概述
1.1原理
1.2 核心概念
1.3实现步骤
二、代码实现
2.1类函数
2.1.1 ImageProducer.cs
2.1.2 ImageRelay.cs
2.1.3 ImageConsumer.cs
2.2winform窗体函数
三、实现效果编辑
四、项目资源下载
C# Winform实战案列(机器视觉)汇总地址:
【C# Winform】 机器视觉实战案例专栏汇总地址
一、概述
近期需要用到c#及halcon算法的联合调用,在进行算法封装时,需要进行多个算法类的封装,需要将相机采集的图像通过Action事件将HImage数据在多个类里面进行传递。
1.1原理
使用
Action
委托进行多次照片的传递,这可以统称为 事件驱动的多层数据传递(或事件驱动的消息传递)。本次项目案列通过
Action
委托和事件机制,图像数据被从源(ImageProducer
)传递到中继(ImageRelay
)再到最终的消费者(ImageConsumer
),形成一个 事件驱动的数据流。最后会将ImageProducer的图像,经过两次传递然后
显示到Halcon的显示空间
1.2 核心概念
事件(Event):通过
Action<HObject>
事件定义,允许不同的对象订阅和响应事件。委托(Delegate):
Action
是一个委托,它指向处理方法,用来响应事件触发。数据传递(Data Passing):图像数据(如
HObject
)在各个环节之间通过事件进行传递,无需直接传递引用,保证了松耦合。
1.3实现步骤
图像生产者(ImageProducer):
负责采集或生成图像。
当图像生成时,触发
OnImageCaptured
事件,通过Invoke
向订阅者传递图像。中继(ImageRelay):
订阅图像生成事件,接收图像。
可以在此进行数据处理或日志记录。
将图像通过
OnImageRelayed
事件转发给下一个订阅者。图像消费者(ImageConsumer):
订阅
OnImageRelayed
事件,接收并处理图像(如显示或保存图像)
二、代码实现
2.1类函数
2.1.1 ImageProducer.cs
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSharpStudy
{public class ImageProducer{public Action<HObject> OnImageCaptured;public void CaptureImage(){HObject ho_Image = new HObject();// 生成一个空图像HOperatorSet.GenImageConst(out ho_Image, "byte", 512, 512);// 创建一个有效区域(例如一个矩形区域)HObject ho_Region = new HObject();HOperatorSet.GenRectangle1(out ho_Region, 100, 100, 400, 400); // 生成一个矩形区域// 在图像中绘制区域(填充颜色)HOperatorSet.PaintRegion(ho_Region, ho_Image, out ho_Image, 255, "fill"); // 填充矩形区域OnImageCaptured?.Invoke(ho_Image);}}}
2.1.2 ImageRelay.cs
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSharpStudy
{public class ImageRelay{public Action<HObject> OnImageRelayed;public void Subscribe(ImageProducer producer){producer.OnImageCaptured += HandleImage;}private void HandleImage(HObject image){Console.WriteLine("中继收到图像,准备转发...");OnImageRelayed?.Invoke(image);}}
}
2.1.3 ImageConsumer.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HalconDotNet;namespace CSharpStudy
{public class ImageConsumer{private HSmartWindowControl window;public ImageConsumer(HSmartWindowControl winControl){window = winControl;}public void Subscribe(ImageRelay relay){relay.OnImageRelayed += ShowImage;}private void ShowImage(HObject image){HImage hImage = new HImage(image);hImage.WriteImage("tiff", 0, "output_image.tiff");window.HalconWindow.ClearWindow();window.HalconWindow.DispObj(hImage);window.SetFullImagePart();}}}
2.2winform窗体函数
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 static System.Windows.Forms.VisualStyles.VisualStyleElement;
using HalconDotNet;
namespace CSharpStudy
{public partial class Form1 : Form{private ImageProducer producer;private ImageRelay relay;private ImageConsumer consumer;public Form1(){InitializeComponent();hSmartWindowControl1.MouseWheel += hSmartWindowControl1.HSmartWindowControl_MouseWheel;producer = new ImageProducer();relay = new ImageRelay();consumer = new ImageConsumer(hSmartWindowControl1); // 控件名// 事件连接relay.Subscribe(producer);consumer.Subscribe(relay);}private void button1_Click(object sender, EventArgs e){producer.CaptureImage();}}
}