.NET插件技术(精选7篇)
.NET插件技术 第1篇
随着软件技术形势的发展, .NET平台进入成熟和普及时期, 开发者原有Delphi开发的基于ArcEngine的原生代码 (区别于.NET、Java等虚拟执行平台) 模块要在.NET开发中复用、要在ArcGIS Desktop中复用成为实际问题。
从技术上角度看, 在C# 中或者在ArcMap的VBA环境中的重新实现模块的功能完全可以, 但是已有的原生代码模块等于废弃。一个可以选用的方式是通过Delphi等开发工具将模块ActiveX DLL化, 并将插件式架构引入到GIS二次开发中 , 可较好地解决此问题。
依据是:(1) ActiveX DLL是COM标准的具体产品, 是COM Object的容器 ; ArcEngine、ArcMap都基于ArcObjects,而ArcObjects是COM标准化的组件集;(2) ArcObjects的ICommand/ITool充当插件接口是关键; (3) .NET平台对COM的良好的兼容性和互操作性。
2 插件式架构与 ArcGIS 插件化开发
2.1 插件式架构与.NET、 COM
插件式架构由宿主程序、插件接口、插件对象以及公用类库组成, 典型的产品如Eclipse。插件式架构具有良好的扩展性, 通过开发新的插件即可扩充软件功能。以插件接口作为通信契约, 易于分离实现, 提高模块内聚、降低模块间耦合。实现插件式开发要解决几个基本问题: 标识插件; 找到插件所在的容器 (插件集); 枚举插件集并获取插件; 对插件实现契约的验证; 插件对象的动态实例化等。
插件式架构与实现技术没有直接关联, 并不要求一定是某种语言或平台。 .NET和COM同为微软的组件技术, 二者都具备实现插件式架构的技术基础, 对上述问题的解决如下:
(1) .NET可采用命名空间和类型名来标识插件 , COM可以用包含CLSID的CoClass来标识插件。
(2) .NET程序可以由宿主程序exe本身或其配置文件来记录与插件集目录的相对关系; COM程序也可以采用类似的方式遍历注册表CLSID, 并依次判断其是否为CoClass, 但效率略低。
(3) .NET中通过反射 (Reflection) 技术可读取程序集所包含的类型, 形成Type [] 数组后由foreach遍历; COM则通过ITypeInfo来枚举类型库中的CoClass。
(4) 契约是宿主程序和插件对象之间的纽带和通信基础。契约是一种数据结构和服务的声明, 在程序设计中可以表现为接口 (Interface)。COM的核心之一是接口, C# 更是从语言层面直接支持接口数据类型。 .NET能实现宿主程序和插件对象的类型匹 配也是采 用反射技 术 , 在COM中则通过QueryInterface来确认“疑似插件”是否实现了插件接口。
(5) 插件对象只有在被宿主程序调用并动态实例化后, 才可以正常 执行进而 允许用户 使用其功 能。 .NET中通过Activator.CreateInstance () 来实例化插件对象 ; COM则规定CoClass是可以实例化的COM类 , 并且要求由插件对象被regsvr32命令注册 后存储于 注册表。 在CLSID项的InprocServer32键记录了实例化方法所在的模块位置 , 在使用CoCreateInstance () 函数创建实例时 , 则通过注册表中CLSID相关信息找到CoClass的实例化方法。
相比而言, 供.NET宿主程序使用的.NET插件不需要注册,这是优于COM技术的地方之一, 但如果开发供COM程序 (如ArcMap) 使用的.NET插件则需要注册 , 注册命令由regsvr32换成了regasm。
2.2 ICommand/ITool 与插件化的 ArcObjects
在基于ArcObjects的开发中, ArcMap或包含ArcEngine控件的exe可看作是宿主程序, 而ICommand/ITool接口可看作宿主程序和插件的通信契约, 通常实现了ICommand/ITool的类被看作是ArcObjects插件对象。ArcObjects插件对象与ArcMap的地图窗 口、内容 表或者与ArcEngine的MapControl、TocControl交互非常方便, 因为通信契约参数CoHookHelper类(.NET中为HookHelper类) 为开发者屏蔽了细节差异, 而不需要将ArcMapUI和Controls类型库同时引入到开发环境中, 并依次判断 宿主程序 是ArcMap ( IMxDocument) , 还是MapControl程序 (IMapControlDefault)。
2.3 非 ICommand/ITool 的 ArcObjects 插件开发
需要指出的是, ICommand/ITool作为通信契约并非唯一的选择, ArcObjects中的IMenuDef、IToolbarDef、IDockableWindow等接口也可充当通信契约, 只是契约的应用目地或封装程度不同而 已。如果 插件不需 要供ArcMap工具栏和ToolbarControl加载使用, 则宿主程序和插件对象之间完全可以用非ICommand/ITool的、自定义的接口作为通信契约来实现交互。参考文献 [3] 在.NET平台下实现了自定义通信契约NBGIS.PluginEngine, 此条件下宿主程序中插件的容器也不再是ArcMap工具栏或ToolbarControl。
3 用 ActiveX DLL 实现 ArcObjects 的插件及其动态加载
3.1 用 ActiveX DLL 实现 ICommand/ITool 插件
首先在Delphi中新建ActiveX Library类型的工程, 如图1所示, 然后在工程中新建COM Object。在向导中, 新建CoClass名称指定为QZFComDragLoadSHP, 如图2所示。为使CoClass类实现ICommand、ITool, 修改类声明为:
开发人员需要依次对ICommand、ITool接口的各成员编写对应实现函数, 其中较为重要的是ICommand.OnClick () 和ITool.OnMouseDown ()。OnClick () 代表了Command的执行内容, 在OnMouseDown () 中可以实现Tool对象与主程序的地图窗口或MapControl的强大交互功能。在编译生成.dll文件后,使用regsvr32命令注册。
3.2 基于 ArcEngine 的原生宿主程序对插件的动态加载
如果在采用界面设计期对ToolbarControl进行Item定制来实现对ActiveX DLL的Command/Tool加载使用的方式, 如图3、图4所示。当有新的Command/Tool开发出来并需要被加载时, 必须再次用开发工具定制ToolbarControl并重新编译生成宿主程序exe, 显然还没有达到宿主程序在运行时动态获取ActiveX DLL并加载插件的目标。
在Visual C++ 6、Delphi 7等开发原生代码开发环境下,可在ArcEngine宿主程序中利用COM的TypeInfo特性, 遍历Active DLL插件集并判断插件符合契约 (实现了ICommand、ITool接口 ) 的插件 , 将其插入到如ToolbarControl等容器中。以Delphi原生宿主程序为例, CreateComObject () 调用COM本身CoCreateInstance () 的功能, 而Supports () 则是更安全的QueryInterface调用。实现代码如下:
3.3 ArcMap 动态加载插件
本质上ArcMap也是一个原生代码的软件, ArcMap本身也具有通过工具栏的Customize对话框“Add from file”加载Command/Tool的功能, 问题也在于当插件集 (.dll文件) 更新时需要再次在Customize对话框中定制。ArcMap对插件的动态加载可在Normal.mxt中编写宏实现, 代码如下:
以上子过程的参数strTypeLibFile即插件集 (.dll文件)。其中IIDFromString ()、CLSIDFromString ()、CoCreateInstance () 3个外部函数均来自ole32.dll, 而TLI.TLIApplication.TypeLibInfoFromFile () 则是引用了TlbInf32.dll。
3.4 .NET 宿主程序动态加载 ActiveX DLL 中的插件
用.NET反射技术直接操作ActiveX DLL是行不通的, 需要先利用COM Interop生成能被.NET反射所识 别的程序 集(Assembly) 。TypeLibConverter.ConvertTypeLibToAssembly () 可以在程序运行时将COM的类型库转为.NET Assembly。C# 实现代码如下:
其中LoadTypeLibEx () 为对外部oleaut32.dll的函数调用,而MyConvertEventHandler则是一个实现了ITypeLibImporterNotifySink接口的类。
随后即可用反射技术遍历Assembly, 将插件对象动态实例化。需要注意的是当Type.IsAbstract值为真时, 表示ActiveXDLL中当前COM类型不是CoClass, 被COM Interop映射为在C# 中的不可实例化的抽象类。具体代码如下:
4 结语
通过将ArcEngine自定义模块的ActiveX DLL化并封装成为Tool/Command, 实现了直接与ArcGIS Desktop的对接, 并可通过识别TypeInfo使原生代码模块的ArcEngine宿主程序完成对插件的动态加载, 通过COM Interop进一步实现了.NET中对COM插件的加载。完全达到了插件开发一次、在3种环境中加载运行且新增插件时不需改动宿主程序的目标。因此, 大量已有ArcEngine自定义原生代码模块经过简单改造 (利用Delphi的VCL或Visual C++的ATL实现ActiveX DLL化) 均可被这3种环境使用, 大大提高了自定义GIS扩展模块的复用程度, 同时插件式架构的引入使GIS软件保持了良好的扩展性。
摘要:使已有Delphi下实现的ArcEngine原生代码模块在ArcGIS Desktop和.NET开发中复用,插件式架构和ActiveX DLL在解决此问题中发挥了良好作用。对比讨论了.NET和COM实现插件式架构的技术路径,并较为详细地给出了利用ActiveX DLL实现GIS插件和3种运行环境中加载插件的开发步骤。
浅析插件技术在软件中应用 第2篇
1.1 插件具有动态链接库
所谓插件动态链接库就是一种具有特定功能在软件运行中可以执行的软件模块, 由于自身的局限性, 本身不能独立运行在脱离相应的软件时, 但是它可以输出已定义的函数, 通过其他能独立运行的程序可以调用自身的内部功能。动态链接库有两种调用方式即为静态调用方式和动态调用方式。
1.2 插件在软件中的接口
在开发支持相应软件插件功能的应用程序是首要任务是解决:插件如何在其宿主程序中能够正确地相互通信和转换。因此、为了能使插件在相对应的宿主程序之间正常德相互通信和转换, 在开发软件的插件前应该先制订一套相互通信的标准, 这套事先制订好的通信标准就是插件与软件的接口, 他们之间只有通过接口才能相互通信。在软件开发过程中, 接口只是一中调用形式而不是软件功能是实现。从实质上讲, 接口就是软件模块的一种调用规范, 从开发支持插件功能的编制程序上讲, 接口制定通常是有软件一主程序的开发者开发编制的。接口功能一般通过宿主程序实现, 因为插件功能的实现需要调用宿主程序的某些功能。因此可以说, 宿主程序与插件之间的信息流是双向的。接口的调用规范与其功能实现相互分离有存在一个突出的优点:虽然不同的插件开发者对同一个接口的实现途径不同, 但是宿主程序在调用这些插件时所有调用方式是完全一样的。另外不同的插件也可以用同一个接口来调用宿主程序的功能。
1.3 插件程序结构及运行机制
在动态链接库中实现插件接口, 在宿主程序中运用显式链接方式动态加载插件。在宿主程序中, 插件的安装和删除通常有插件在宿主程序的管理部分控制, 把安装插件的所有信息保存到宿主程序中的一个适当的地方。通常是保存到注册表或着是一些其他的配置文件中。
2、如何实现插件的可行性方案
目前对于软件中的插件的实现, 主要有动态链接库 (D L L) 、COM组件两种方案, 但普遍运用在系统中的是动态链接库 (DLL) 方案, 在动态链接库 (DLL) 中, 集中实现插件, 用户只需在Windows系统下编制一些DLL数据, 然后再花一些时间熟练掌握软件相关插件的编程规则以及调用规则, 就可对插件进行设计和开发, 从而实现插件所具有的特种功能。另外一种便是COM, 是一种组件的对象模型。COM既提供了组件与宿主程序之间进行交互的规范, 也为实现相互交互提供了良好的环境。COM接口是COM对象与Windows系统之间的交互通道, 但调用插件的函数在同类插件间是基本相同的, 因而, 可以编写C O M插件来编写于软件向匹配的插件。使用C O M技术在编写插件中有着一个很大的优势, 那就是它更易于使插件与系统间功能的进行交互。但主要的问题是由于C O M技术及原理的复杂性, 从而使开发者很难用该项技术编写插件来解决实际问题。
3、插件在地震系统中的应用
3.1 地震系统对插件基本需求
当今社会, 各国对地震的关注越来越大, 因而地震处理系统也越来越精确, 对插件的需求也越来越大。地震处理系统主要包括数据的输入、输出和数据处理3个部分。然而在在数据过程中中, 宿主程序首先将插件所需要数据和相关信息通过接口输送到插件程序中, 然后任务全部由插件来完成, 最好, 插件将处理好的数据通过接口输送个宿主程序。
3.2 地震系统中主程序和插件的工作过程
根据以上对对插件实现的机制的分析, 可以吧地震处理系统分为主程序和插件。主程序负责管理数据和加载功能模块, 建立一个模拟实际情况的处理流程;插件功能由动态链接库来实现。因此, 通过主程序对地震信息的管理和加载, 来实现插件对地震数据的处理。为了能够更好的相互通讯就需要宿主程序好插件之间制定完善的通信和数据传输的规则和协议, 这就是地震系统和插件之间的接口。值得注意的是, 宿主程序和插件都能够记录整个程序运行过程中产生的信息、错误以及错误处理, 并将其存在特定的文件中, 以备用户对相关信息的查询。
3.3 地震系统中主程序和插件之间接口设计
系统主程序和插件之间需要传递数据和信息, 为了能够高效无误的相互输送所见就必须需要设计一个数据结构, 它能够将插件所需要的所有数据和信息收集进来以便插件程序的运行。数据结构要完全根据地震信息文件格式进行设计, 目的是传递插件程序所需要的参数以及处理后数据存储地址。接口中应含有数据主要的道头信息、输入文件地址、数据内存地址、画图函数地址, 以及其他插件的内存地址。是插件能够通过接口获得所需的全部信息及其相应的地址, 从而使宿主程序和插件之间能够通过接口很好的进行信息的输送。
4、结语
目前, 很多软件及系统的正常工作都需要相应插件, 插件给软件功能的扩大起到了不可估量的作用, 插件技术的发展使计算机越来越智能化, 因此, 软件设计过程中应注重宿主程序与插件之间的接口设计, 为以后插件的应用提供一个通道, 这不仅扩大了软件的功能也为软件操作者提供了方便, 使之能够更好的应用软件。
参考文献
[1]刘兴平.插件技术研究初探[J].延安大学学报, 2006.
[2]吴亮, 杨凌云.基于插件技术的GIS应用框架的研究与实现[J].地球科学, 2010.
[3]陈方明, 陈奇.基于插件思想的可重用软件设计与实现[J].计算机工程与设计者, 2008.
基于COM组件的插件平台技术研究 第3篇
关键词:COM组件,插件平台,扩展性,接口
1 插件平台基本原理
插件的本质是在不修改程序主体的情况下对软件功能进行加强当插件的接口被公开时任何人都可以自己制作插件来解决一些操作上的不便或增加一些功能一个插件框架包括两个部分:主程序 (host) 和插件 (plug-in) 主程序即是“包含”插件的程序。插件必须实现若干标准接口由主程序在与插件通信时调用。
插件主要有3种实现方式:普通的输出函数的DLL方式、使用C++的多态性、使用COM组件。在很多大型的软件中 (如Arc Gis、Office) 中都是采用COM组件, 本文主要研究COM实现方式。
COM (Component Object Model组件对象模型) 适合构建大型系统的插件平台。基于COM建立的插件系统, 主程序和各个插件可以用不同的编程语言进行开发 (C++、VB、Java等) , COM能使它们无缝地结合在一起。
在这样的一个系统中, 插件是一个COM组件。确切地说, 插件程序作为COM组件程序包含了一个或多个COM对象, 这些COM对象都实现了相同的COM接口, 主程序通过这个COM接口来访问COM对象, 即COM接口是主程序与插件通信的唯一手段。篇幅所限, 有关COM的原理与编程见参考文献
2 插件平台工作流程
对于一个普通的插件系统来说, 它的主要工作过程为:
(1) 按照插件规范生成相应的插件。首先必须按照插件的规范生成插件, 插件有特定的结构, 生成的插件必须具有这样的结构才能被宿主程序正确地调用。
(2) 宿主程序得到插件的存储位置信息。宿主程序启动的时候必须能够知道插件的存储位置, 然后才能够正确地加载。通常可以通过以下3种方式得到插件的信息: (1) 通过将插件的位置写成一个配置文件, 如ini文件或者XML文件, 宿主程序在启动的时候通过读取配置文件来得到插件的存储位置; (2) 将应用程序的所有插件放在一个特定的目录下, 然后让宿主程序启动的时候去搜索这个特定的目录; (3) 可以将所有插件的存储位置信息保存在注册表的某一个特定的路径中, 宿主程序启动的时候遍历这个特定的路径下的所有项的值。
(3) 宿主程序根据位置信息加载插件:宿主程序根据步骤 (2) 中得到的插件存储位置信息动态加载插件。
(4) 判断该插件是否能够被宿主程序正确地识别。调用被加载的插件的导出函数, 这个导出函数是插件的一个接口, 通过这个接口来判断和识别该插件是否是这个应用系统的插件。
(5) 得到插件的名称、图标及其他重要信息。通过接口得到插件的相关资源和其他的信息。这些资源主要用来构造系统的界面显示。
(6) 为了用户在点击某个图标后可以正确的调用到对应的插件, 在宿主程序中将插件的名称等资源与插件的位置做好映射。
做这个映射的主要目的是因为在宿主程序的界面中看到的图标等资源是由各个插件中的图标等资源构成的, 插件虽然驻留在宿主程序的进程地址空间中, 但是不在宿主程序中建立插件的图标与插件存储位置的映射关系的话, 就无法正确调用相应的插件。
(7) 宿主程序将这些插件的名称、图标等资源的副本加载到自己的进程地址空间中, 更新系统的界面显示。宿主程序在这一步中主要根据相关插件资源的副本, 将这些资源显示到界面上来。
(8) 当用户点击后, 根据 (7) 中建立的映射关系, 调用相应的插件。当用户点击宿主程序上的图标时, 根据映射关系, 找到相应的插件, 通过调用相关的接口来实现对插件功能的调用。系统工作过程如图1所示:
3 插件系统的实现
普通的COM组件使用步骤是这样的: (1) 分别制作COM组件服务器和客户端部分代码; (2) 使用Regsrv32.exe程序将COM组件注册到Windows的系统注册表中; (3) 在客户端运行的时候使用己知的COM组件的UUID来创建一个组件的实例并目使用。
插件实际上是COM的功能扩充, 其扩充出来的功能是为了完成直接将插件文件拷贝到特定日录下就能够完成新功能的添加操作, 因此插件与普通的COM还有一些区别。
为了解决插件的的自注册, 可以使用带有自动化 (Automation) 的COM组件, 在该组件内含有3个可以直接导出的DLL函数, 分别是Dll Can Unload Now () , Dll Get Class Object () , Dll Register Server () 。其中的Dll Register Server () 函数就可以自动将所在的COM组件进行注册。对于已经支持自动化的COM组件, 实现自动注册的具体代码如下:
在上面的第3步中, 存在一个问题, 就是我们的主程序必须在编译的时候己经知道要使用到的COM组件的UUID (包括组件服务器的CLSD以及接口的IID) , IID因为是事先统一定制的, 所以可以编译进去, 但是每一个不同的插件的CLSD却是相互不相同的, 而且是在主程序编译的时候并不知道的, 因为大部分的功能模块插件都是在以后补充的。所以还必须能够解决如何从新拷贝过来的COM组件中获得其CLSID信息的问题。
要解决这个问题, 我们可以采用在DLL中嵌入资源的方式来实现, DLL文件中是可以放置各种类型的资源, 例如字符串表 (String table) , 图标 (Icon) 等等。那么如果需要解决取得CLSID的问题, 只需要增加一个字符串资源, 在里面以字符形式记录CLSID, 然后在主程序执行的时候, 设法从组件的DLL文件单面取出这个字符串资源, 然后利用系统的一个函数CLSID From String () 将字符串形式的CLSID转换成为UUID格式, 这样就可以获得需要的CLSID了。
4 结束语
插件作为特殊的组件具备组件的所有优秀的特性。这些特性使其在开发、推广、应用方面有重要的现实意义。基于COM组件的插件技术可以使产品专业化、标准化、系列化, 通过不同规格和系列的插件的组合, 可以快速地完成应用系统原型, 而通过对插件的局部修改来满足客户的需求和升级。
参考文献
[1]梅宏.软件工程:实践者的研究方法[M].北京:机械工业出版社, 2003.
[2]陈方明, 陈奇.基于插件思想的可重用软件设计与实现[J].计算机工程与设计, 2005 (1) .
[3]王帮进, 张宏, 蒋文明, 等.基于插件的房产GIS集成研究[J].微计算机信息, 2007 (2-1) .
[4]林泉, 魏蛟龙, 于功敬.COM插件技术在故障诊断系统开发中的应用和实现[J].计算机测量与控制, 2003 (4) .
[5][美]Dale Rogerson.COM技术内幕——微软组件对象模型[M].杨秀章, 译.北京:清华大学出版社, 1999.
影视抠像技术之常用外挂插件剖析 第4篇
从原理上讲,只要背景所用的颜色在前景画面中不存在,用任何颜色做背景都可以,但在工作实际中,最常用的两种背景却是蓝色和绿色。究其原因在于,人身体的自然颜色中包含的这两种色彩较少,同时这两种颜色也是RGB系统中的原色,比较方便处理和识别。 我国一般使用蓝色或绿色背景;在欧美国家由于很多欧美人的眼睛是蓝色的, 所以在拍摄人物时常用绿屏幕。
为了便于后期制作时提取通道, 进行蓝屏幕拍摄时,有一些问题要注意:首先,前景物体上不能包含所选用的背景颜色;其次,背景颜色必须一致, 光照应均匀,要尽可能避免背景或光照深浅不一等现象发生。总之,前期拍摄时考虑得越周密,后期制作越方便,效果也越好。
有时候需要抠像的画面比较困难,用前面所讲的原理很难得到理想的效果。尤其是那些非常细小的物体, 或者是半透明的物体,如头发丝、烟雾、 纱或丝绸、水流、玻璃等就是如此。笔者将在这里剖析三款最著名的外挂抠像工具Ultimatte、Primatte keyer和Keylight。
Ultimatte
这款插件对于使用硬件抠像制作虚拟演播室的同行们来说并不陌生,Ultimatte技术被很多硬件厂商购买后,打包到视频卡上作为实时抠像工具。此外,Ultimatte作为独立的安装程序支持Shake、After Effects、 Digital Fusion等各种后期合成软件。Ultimatte由Grain Killer、Screen Correction和Ultimatte三大部分组成。
Ultimatte有一个独一无二的工具Screen Correction(背景修正)。这个工具是专门用来应对背景打光不均匀、 色彩不统一、有杂质时使用的。很多时候由于前期硬件条件的限制,拍摄的背景色过渡并不是很均匀。这时候就可以使用Screen Correction(背景修正)来将整个背景色处理成较为均匀的过渡颜色。
在使用Screen Correction(背景修正)工具之后,画面上会留下一些细小的颗粒。如果立刻就进行抠像的话, 这些颗粒会影响后面叠加背景的融合效果。这时可以使用Ultimatte提供的Grain Killer(清除颗粒的工具)。放大显示视图,点击Backing Color选项后面的小吸管并在屏幕上选取要清除颗粒的色彩范围,设置Master Offset(偏移值),直至画面上的颗粒消除即可。
Ultimatte的优势主要体现在Screen Correction(背景修正)工具上。 比如在后期处理中,遇到了拍摄的背景灯光打得一塌糊涂或灯光变化较为丰富,那么Ultimatte的确是最佳选择。
不过不要忘了在现场拍摄的时候多拍几张同样机位的图片作为参考。否则,背景清理工具也发挥不出它的优势。
Primatte Keyer
Primatte Keyer是一款超级强悍的抠像插件,这个版本是迄今为止我见到的设计很完美和强大的插件之一。该插件拥有独一无二的抠像算法、干净和精确的颜色溢出排除功能、简单的参数设置。它的最大特点就是操作简便, “划来划去”就可得到很好的效果。其中, Refinement和Alpha Controls两个功能也得到了前所未有的体现和升华。
核心参数阐述如下。
1Spill(溢出)与Spill Spong(溢出海绵)的区别:都是同样的处理非抠除物体中反射屏幕的颜色工具。在一般情况下,我们是先使用Spill Spong(溢出海绵),再使用Spill(溢出)作为一个补充。
2Matte Spong(梦版海绵)主要用于处理蒙版中的灰点,提高蒙版的质量。
3Refinement(细化)调节工具, 是Primatte Keyer特有的、新增加的功能,可以用它来处理蒙版的密度。
4 Alpha Controls(通道处理)允许使用者调节不光滑的蒙版来达到一个高级的合成。
5Base Color Sample(基本颜色采样)主要用于控制背景的平衡度,类似Ultimatte中的屏幕修复工具。
Keylight
Keylight是曾经获得学院奖的抠像工具,一直运行在高端平台上(如Discreet的flame*、flint*、inferno*、 fire* 和smoke* 等)。当然,在目前的PC平台,Keylight也做了移植,其功能和算法是十分强大的,尤其是对头发等半透明物体采用二元抠像算法,大大提升了采样和抠像的精度。另外,Keylight对蓝色和绿色的修复能力也是最好的, 对线形渐变的效果支持也很不错。
核心参数阐述如下。
1 Screen Balance控制画面的饱和度。我们可以利用这一特性来进行抠像处理。一般的,蓝屏的话该参数设置在95% 左右,绿屏设置在50% 左右。 如果效果不好的话可以设置5%、50%、 95%,再进行调节。
2Despill Bias为当抠除的颜色值过爆或过小的时候,我们可以使用该参数来进行调节。当过爆时我们使用负数来进行调节,而当过少时我们可以使用正数来进行调节。
3 Clip Rollback是对Clip Black、Clip White的一个细节补偿。尤其是在使用了Clip Black、Clip White损失了图像边缘细节的时候,使用该参数是十分有帮助作用的。特别要说明的是大家都一致认为Keylight对有关毛发操作的支持很棒,其实该参数就是其优势之一的体现。Replace Method/ Replace Colour重在对灯光反射进行处理。
抠像是影视拍摄制作中的常用技术,特别是很多影视特技的场面,都需要用到大量的抠像处理。抠像的好坏, 一方面取决于前期对人物、背景屏幕、 灯光的精心准备和拍摄完成的源素材, 另一方面还要依靠后期合成制作中的抠像技术。
插件技术在储层建模系统的应用 第5篇
插件技术是一种组件复用的技术。近年来人们受到硬插件技术的启发,即计算机的硬件设备是由许多插件板连接而成的,而这些插件板又是将许多具有独立功能的集成电路插件按插件板的设计要求组装连接而成的,各种插件通过总线使其能够相互通信、协同工作。软件开发中插件技术的基本工作原理是:系统框架由宿主程序、接口和插件3部分组成,宿主程序负责插件之间的通信和相互操作,接口负责插件注册、卸载、插件的设置、初始化、启动、关闭工作。插件就是普通的程序,可以完成某种功能。由于对插件接口制定了统一的规范,用户可以根据自己的需要制作功能插件,通过接口集成到系统框架中去。修改或卸载某个功能插件,而宿主程序不用修改口。通过这种技术,增强软件的灵活性和可扩展性,使得软件复用性大大提高。
一般来说插件可以分为3类: (1) 声明式插件; (2) 组件式插件; (3) 接口式插件。本文主要研究的是接口式插件。插件自身不能独立运行,但是它通过宏定义输出函数或类,通过其它能独立的程序(宿主程序)调用它的内部功能。此类功能插件可以通过统一的插件接口契约,解析符号获得插件中的函数签名,由宿主程序对插件继承接口的合法性作出判断后,在恰当的时间点调用它们,对于失效的或者用户暂时不需要的功能插件,可以进行卸载,这样可以有效降低系统框架的维护功能插件的复杂度。
1 基于储层建模系统框架设计
储层建模系统,正式名为“储层地质统计分析系统GASOR”(Geostatistical Analysis System of Reservoir)包含十二个基本模块,具有15万行以上代码量,研发此软件始于1985年,至1995年完成了GASOR1.0的版本,受到国家自然科学基金项目资助,并与大庆、胜利等油田进行了合作研究,在系统主体功能已经相对完善的情况下,面对用户的新需求,将近几年研发出来的新功能模块加入到系统中,因此,我们搭建了插件式开发框架,插件式框架主要包含以下4个模块:插件管理模块、界面管理模块、类型库管理模块和接口管理模块,系统基本框架图如图1所示:
1.1插件管理模块
插件管理模块,该模块定义了插件类型库,主要功能是维护管理插件加载或卸载。插件库在运行状态下查询实例化插件接口的实现类等。该模块是其他功能模块的基础,其他模块在实现其功能时需要依赖于它。平台核心模块包括的主要功能为:插件接口有效性检查、插件信息识别、插件注册与卸载。
1.2界面管理模块
界面管理模块主要完成插件界面的动态加载,将系统需要的插件界面动态地加入到主界面。
1.3类型库管理模块
类型库管理模块的主要功能是:插件类型库是为记录插件类型信息,宿主程序启动时检索插件信息,并根据预定的插件接口装载插件。通过类型库管理模块,可以将我们的网格粗化插件等需要扩充的功能模块插件加载到系统。
1.4接口管理模块
此模块是基于策略模式实现的插件接口如图2。在C++实现中,abstract_interface虚基类是插件技术开发的重要类,任何需要被框架程序直接识别的插件类必须继承该类。在实现过程中name()、initial()、execute()是必须实现,在插件库注册的函数create()是必须实现的。
2 主要实现代码
2.1插件注册实现
2.2用户自定义插件实现
3 结束语
本文基于储层建模系统构建了基于插件式的开发框架,通过实践证明是可行的。通过插件技术,很好地将地震解释模块、网格粗化模块以及地震反演等模块融入到储层建模系统中,很好地解决了软件复用性,对软件的扩展和维护带来很大的便利。系统发布后可在不必重新编译系统的前提下按需对系统功能进行扩充。
摘要:插件技术的本质是在不修改程序主体的情况下对软件功能进行加强与扩充, 可以通过制作插件来增加一些新功能。介绍了插件技术在储层建模系统中应用的基本设计思想与实现, 以策略模式为基础, 实现了插件接口, 构建了插件式开发框架, 增强了系统扩展性, 使系统更易维护与复用;同时通过插件应用实例的介绍, 给出了插件技术在储层建模系统中的实现方法。
关键词:插件技术,储层建模,策略模式,接口,框架
参考文献
[1]何文海, 谢建刚.基于.NET平台的插件式应用框架开发[J].电脑知识与技术, 2007 (9) .
[2]于珊珊.基于MFC的插件应用程序设计与实现[J].计算机与信息技术, 2007 (8) .
[3]王晓峰, 李颜, 柴变芳.插件式软件开发框架[J].软件导刊, 2008 (6) .
[4]蔡志明, 卢传富, 李立夏.精通Qt4编程[M].北京:电子工业出版社, 2008.
[5][加]GASMIN BLANCHETTE、[英]MARK SUMMERFIELD.C++GUI Programming with Qt4[M].Publisher:Prentice Hall, 2006.
[6]ANDREI ALEXANDRESCU.Modern C++Design[M].Addison-Wesley Professional.2001.
关于计算机软件中插件技术的探讨 第6篇
一个可以挂接插件的软件系统, 通常包括主程序 (host) 和插件 (p1ug-in) 组两个部分。独立的主程序和插件能够互相结合在一起工作, 必须有一套互相协作的规则和协议, 使不同来源的程序互相协调工作。这些规则和协议称为插件系统的接口。插件可以由动态链接库实现, 主程序根据接口规则, 调用插件的功能, 同时还可将任意插件接口在内存中的地址传递给每个插件, 插件则根据这些地址来调用其他插件函数, 完成所需功能、获取所需资源等。
1插件技术的原理
1.1动态链接库动态链接库 (Dynamic Link Library) 是一种具有一定功能的可执行软件模块, 虽然它本身不能独立运行, 但是它可以输出函数或类, 通过其他能独立运行的程序 (宿主程序) 可以调用它内部的功能。动态链接库有两种调用方式:
1.1.1静态调用方式由编译系统完成对DLL的加载和应用程序结束时DLL卸载的编码 (如还有其他程序使用该DLL, 则Windows对DLL的应用记录减1, 直到所有相关程序都结束对该DLL的使用时才释放它) , 简单实用, 但不够灵活, 只能满足一般要求。
1.1.2动态调用方式是由编程者用API函数加载和卸载DLL来达到调用DLL的目的, 使用上较复杂, 但能更加有效地使用内存, 是编制大型应用程序时的重要方式。显式的调用是指在应用程序中用Load Library或MFC提供的Afx Load Library显式的将自己所做的动态连接库调进来, 动态连接库的文件名即是上面两个函数的参数, 再用Get Proc Address获取想要引入的函数。
1.2接口开发支持插件功能的应用程序必须解决一个问题:如何在宿主程序与插件间正确地相互通信。俗话说“没有规矩不成方圆”, 为了在宿主程序与插件间能正确地相互通信, 应该先制订一套通信标准, 这套制订好的通信标准就是接口, 宿主程序与插件只能通过制订好的接口进行通信。
2插件的类型
从广义的范围来看, 插件有以下三种类型:
2.1类似批命令的简单插件。事实上这种插件的自由度非常低。使用这种方法的软件有Win Hacker等, 运行这种插件后, 会一步步要求用户进行选择/输入, 最后根据用户的输入来执行一系列事先定义好的操作。这种插件一般是文本文件。功能比较单一, 可扩展性极小。优点是插件做起来非常方便, 即使是对程序设计了解不多的人也可以制作。如Win Amp的Skin。
2.2使用一种特殊的脚本语言来实现的插件 (暂时称为脚本插件) 。这种插件比较难写, 需要软件开发者自己制作一个程序解释内核。有一套著名的Office辅助工具就是完全用Office内置的VBScript写成的。这种方法的优点在于无需使用其它工具来制作插件, 软件本身就可以实现, 普遍出现于各种办公自动化软件中。
2.3利用已有的程序开发环境来制作插件。例如Photo Shop等软件使用的方法。使用这种方法的软件在程序主体中建立了多个自定义的接口, 使插件能够自由访问程序中的各种资源。这种插件的优势在于自由度极大, 可以无限发挥插件开发者的创意, 这种插件是狭义范围的插件, 也是真正意义上的插件。而这种插件机制的编写相对, 对于插件接口之间的协调比较困难, 插件的开发也需要专业的程序员才能进行。
3插件的应用及功能
3.1插件技术的应用及功能。计算机软件中的插件的本质在于不修改程序主体 (平台) 的情况下对软件功能进行扩展与加强, 当插件的接口公开后, 任何公司或个人都可以制作自己的插件来解决一些操作上的不便或增加新的功能, 也就是实现真正意义上的“即插即用”软件开发。平台+插件软件结构是将一个待开发的目标软件分为两部分, 一部分为程序的主体或主框架, 可定义为平台, 另一部分为功能扩展或补充模块, 可定义为插件。在进行软件开发之前, 是否采用平台+插件结构进行软件开发, 还要依据具体的软件需求情况进行确定, 但一般来讲, 使用平台+插件结构进行软件设计会给所开发软件增加新的生命力。
3.2计算机软件中的插件。最吸引人的地方当然就是其所实现“运行时 (run-time) ”功能扩展。这意味着软件开发者可以通过公布插件的预定义接口规范, 从而允许第三方的软件开发者通过开发插件对软件的功能进行扩展, 而无需对整个程序代码进行重新编译。运行时 (runtime) 是相对于编译时 (assembly-time) 而言的。一般来说, 软件开发者对软件功能更新时, 是在源代码级别进行更新, 然后对整个程序进行重新编译, 进而发布应用程序的新版本, 这就是编译时 (assembly-time) 的软件更新。
3.3我们也可以将应用服务器简单理解为对已有中间件技术的更高层次的封装。在电子商务应用中, 应用服务器中间件把不同的应用软件作为构件整合到一个协同工作的环境中, 并为应用提供名字、事务、安全、消息、数据访问等服务, 此外它还提供应用构件的开发、部署、运行及管理功能, 有效提高了应用的运行效率, 大大简化了电子商务应用开发的周期和成本。
3.4为了实现平台+插件结构的软件设计需要定义两个标准接口, 一个为由平台所实现的平台扩展接口, 一个为插件所实现的插件接口。这里需要说明的是:平台扩展接口完全由平台实现, 插件只是调用和使用, 插件接口完全由插件实现, 平台也只是调用和使用。平台扩展接口实现插件向平台方向的单向通信, 插件通过平台扩展接口可获取主框架的各种资源和数据, 可包括各种系统句柄, 程序内部数据以及内存分配等。插件接口为平台向插件方向的单向通信, 平台通过插件接口调用插件所实现的功能, 读取插件处理数据等。平台插件处理功能包括插件注册、管理和调用, 以及平台扩展接口的功能实现。
4关于软件插件的实例
Desk View是第一个运用插件技术的桌面管理产品, 通过Deks View插件, Desk View可以企业OA、ERP系统成功对接, 真正实现集成管理的桌面管理平台。Desk View为一家集团客户成功实现了Desk View与OA系统的对接, 在Desk View管理系统中成功签入了办公操作功能, 集团客户的员工兴奋的说, Desk View太酷了, 原来复杂的操作可以在Desk View中方便的操作, 并切Desk View的即时沟通功能, 大大方便了员工之间的沟通。
结束语
系统集成与功能扩展、重用是计算机数据中心中普遍采用插件技术主要解决的问题。数据中心涉及对多种专题数据的一体化管理, 每种专题数据都是针对不同专业模型设计的, 并需要与之相匹配的管理工具。采用插件技术能够对现有多系统进行有效的整合。在网络经济大发展、电子商务大发展的今天, 从插件获得利益的不仅仅是IT厂商, 随着插件技术逐步向着规范化、多样化、构建化、平台化、实用化的方向不断发展, 技术日益成熟并广泛应用于各行各业, 开发人员, 商家乃至用户等都将成为从中受益的大赢家
摘要:应用插件技术, 可以很好地提高软件的重用性和扩展性, 解决软件合作开发与集成问题具有很好的理论和实用价值。
关键词:插件原理,类型,功能应用,实例
参考文献
[1]刘兴平.插件技术研究初探[J].延安大学学报 (自然科学版) , 2006 (1) .
[2]刘家彬, 谭斌, 陈渝.基于windows操作系统动态链接技术的分析与实现[J].乐山师范学院学报, 2005 (12) .
计算机软件中的插件技术分析 第7篇
1 Open Stack云平台概述
云计算作为一种新的计算模型, 凭借其节省资源、降低成本、高可扩展性等优点得到了快速发展, 在此过程中开源云计算架构也得到不断发展和完善。Open Stack具有以下几个方面的优点:代码架构清晰, 开发者可以根据自己的需要修改相应的代码;性能稳定, 提供了完善虚拟机管理功能;部署灵活, 用户可以根据自己的需要, 进行相应地部署。
Opentstack主要有5大组件组成:Nova (计算服务) 、Swift (存储服务) 、Glance (镜像服务) 、Keystone (识别服务) 、Dashboard (用户界面服务) 。Nova是整个平台的核心, 是云平台的控制器, 它提供管理虚拟机的所有功能, 其中包括创建虚拟机实例、管理网络、控制用户等。Swift是一个具有容量大、扩展性高, 并具有冗余和容错机制的对象存储系统。Glance是负责管理虚拟机镜像image的, 功能主要包括存放image、检索image等功能, 并向外提供接口, 用户可以根据自己的需求调用相应的API请求检索实际的镜像和查询VM元数据。Keystone主要负责管理和认证Open Stack租户、角色, 并为Swift提供授权服务。Dashboard是提供给用户访问Open Stack云平台Web前端界面, 用户可以使用它方便使用Open Stack云平台的功能。
2基于Open Stack的高可用系统插件设计
基于Open Stack云平台, 构架一个自动检测故障, 并进行恢复的云平台的插件。该插件主要从三个层次检测故障, 第一, 从物理主机层, 检测物理主机运行时可能发生的故障;第二, 从虚拟机层检测虚拟机运行时可能发生的故障;第三, 从虚拟应用层, 检测虚拟机中运行的进程发生的故障。该平台主要的思路是借用现有的开源云平台Open Stack的API, 包括GUI层、Scheduler调度层、逻辑层和功能层层。按照该系统的工作机制, 该系统从逻辑上化分为四个模块:感知模块、策略模块、执行模块、GUI模块。
GUI层:主要用来与用户进行交互, 用户可以通过该界面, 获得系统的运行状况, 其中包括:虚拟机的运行状态、虚拟机的资源情况等, 同时用户可以通过界面控制虚拟机的运行状况 (例如停止某台虚拟机) , 也可以进行一些系统的基本配置 (比如扫描时间的设置) , 使得整个系统更灵活、更智能。
Scheduler调度层:主要是负责对事件队列进行操作, 是整个系统的核心, 该层能够保证事件有条不紊地被执行。此外, 它需要对事件队列满、事件队列空等各种异常进行处理, 同时保证进程同步。
逻辑层:我们采取的是事件驱动机制, 每个事件都有相对应的处理对象。我们的事件主要分为三种:感知事件、策略事件、执行事件。感知模块响应感知事件, 策略模块响应策略事件, 执行模块响应执行事件。
功能层:主要是对Libvirt API和Open Stack API的封装, 用来与Open Stack和Libvirt进行交互, 是整个系统的底层, 提供对上述几层的支持。
该插件由三个模块组成。
感知模块:由感知层执行类和感知层功能类组成, 负责感知整个系统的运行情况, 感知功能类是最底层类的, 提供对感知执行类的支持。目前, 从三个层次进行感知, 第一层是感知物理主机, 主要包括物理主机电源、主机网络、物理主机CPU利用率、物理主机内存使用率、物理主机硬盘的使用情况;第二层是感知虚拟机, 主要包括虚拟机状态、虚拟机网络、虚拟机CPU利用率、虚拟机内存使用率、虚拟机磁盘的使用情况;第三层是感知虚拟应用, 主要包括虚拟应用状态、虚拟应用CPU使用率、虚拟应用内存使用率、虚拟机应用链接数、虚拟机应用是否存在。
策略模块:是由策略层执行类和策略功能类组成。主要根据感知的结果进行处理。若感知的结果是正常的, 我们将什么都不处理, 若感知的结果是异常的, 我们就要进行制定相应的恢复策略。
执行模块:主要是由执行层执行类和执行功能组成。其主要负载故障的恢复, 针对主机, 我们主要提供重启主机、配置主机网络、恢复主机上所有虚拟机、通知管理员等措施;针对虚拟机, 主要由删除虚拟机、重启虚拟机、迁移虚拟机、配置虚拟机网络、通知管理员等措施;针对应用层, 我们主要是恢复应用、关闭进程等措施。
从上面的描述, 该插件模块执行的逻辑关系是:感知模块触发策略模块, 策略模块块触发执行模块。
参考文献
[1]张倩楠.关于计算机软件中的插件技术的探讨[J].信息通信, 2015, (4) :112-112.
[2]王雪.计算机软件中的插件技术研究[J].科学与财富, 2015, (6) :484-484.
[3]蔡广松.关于计算机软件中的插件技术的探讨[J].计算机光盘软件与应用, 2013, (15) :304-304, 306.