本來是寫用Mil作grabber, vidi作processor
後來想想說把他抽象化,趁機研究了一下abstract, Interface跟呼叫base的contructor
processor的介面大致如下
他可以設定/提取處理影像的格式(這裡我是假設影像規格是一致的)
在處理完成後會觸發bufferWritable事件,以通知這個buffer可以被覆蓋
可以被通知等待處理的暫存器已經準備完成
interface IImageProcessor
{
ImageInformation imageInformation { get; set; }
event BufferOkHandler bufferWritable;
void SetImage(byte[] image);
}
provider的介面如下
可以知道提取影像的格式
輸出影像後會觸發outBufferReady事件
可以被通知儲存輸出影像的暫存器已經準備好了
public interface IImageProvider
{
ImageInformation imageInformation { get; }
event BufferOkHandler outBufferReady;
void SetOutBuffer(byte[] buffer);
}
provider跟processor之間有一定的關聯性
例如:
provider的影像格式跟processor一樣
provider觸發的outBufferReady事件會由processor的SetImage處理
processor觸發的bufferWritable事件會由provider的SetOutBuffer處理
因此可以建立一個抽象類別,這個類別描述如何使用一個provider來建立一個processor(建立processor不必實際知道provider全部的實作細節,只需要知道provider介面底下的東西)
這個抽象類別大概如下
public abstract class ImageProcessorAbstract:IImageProcessor
{
public abstract ImageInformation imageInformation { get; set; }
public abstract event BufferOkHandler bufferWritable;
public abstract void SetImage(byte[] image);
public ImageProcessorAbstract(IImageProvider provider)
{
SetProvider(provider);
}
public void SetProvider(IImageProvider provider)
{
if (provider != null)
{
provider.outBufferReady += SetImage;
bufferWritable += provider.SetOutBuffer;
imageInformation = provider.imageInformation;
}
}
}
因為要實作IImageProcessor介面,所有interface中的member都需要實作,但如果依然還沒有要實作,可以用abstract屬性
可以看到我們abstract class中主要是產生用provider建構的建構式。
最後在實作class的時候只需要繼承abstract class就同時表示時作了介面public class VidiController:ImageProcessorAbstract
在實作class建構式中需要去呼叫base的建構式,例如:
public VidiController(string remoteAddress,IImageProvider provider = null) : base(provider)
{
vidiControl = new ViDi2.Runtime.Remote.Control(remoteAddress, ViDi2.FormsImage.Factory);
}
其中: base(provider)就是在呼叫AbstractClass的建構式。這裡provider可以不指定,預設值為null
沒有留言:
張貼留言