马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
matlab的combuilder系列-matlab下做com组件<BR><BR>com builder是matlab6.5才有的,也是mathworks公司推荐使用于混合编程的,这些日子我<BR>对他进行了全方位的摸索,感觉是爽呆了,下面我们一起来揭开它的神秘面纱,^_^。<BR> 此系列分为以下几块:<BR> 1.matlab下做com组件<BR> 2.vb,c#.net实现调用<BR> 3.vc实现调用<BR> 4.打包<BR> 5.优缺点评注<BR>其中2,3部分可以选择一个看<BR><BR>matlab下做com组件<BR> com是component object module的简称,它是一种通用的对象接口,任何语言只要按照<BR>这种接口标准,就可以实现调用它。matlab6.5新推出来的combuilder就是把matlab下的程<BR>序做成com组件,供其他语言调用。<BR> 我们先准备两个测试文件,并copy一个图片到c盘下,起名叫1.jpg(这些你都可以改<BR>的,我这儿是为了程序方便):<BR> 第一个叫im_test.m如下:<BR> function im_test %这个文件不带输入与输出<BR> I=imread('c:\1.jpg'); %因为以前带有imshow的程序用mcc编成dll后用不<BR> %了,所以想试combuilder是否<BR> imshow(I); %能支持这些函数<BR> 第二个叫split2rgb.m,就是前些日子Zosco发给我的那个程序,因为它用mcc编成dl<BR>l后有问题,所以我在这儿继续将它进行测试,而且它也带有多个输入及输出参数,所以也<BR>正好拿来测试<BR> 在matlab的workspace下打comtool,就打开了matlab com builder,点击file-new <BR>project,新建一个工程,在component name里填上comtest,Class name里填上一个sglt<BR>est(并将自动生成classes里的comtest remove掉),complie <BR>code in选c或c++都无所谓,将Complier options里的Use Handle Graphics library的复<BR>选框画上,点击ok就行了。然后点击project--Add files,将im_test.m和split2rgb.m添加<BR>入工程,然后点Build-Com Object,就会在comtest\distrib\文件夹下生成一个comtest_<BR>1_0.dll(它就是做好的com组件),Build时matlab已经自动将此dll在注册表中注册,为了下<BR>面能用其他编译器调用,我们还需做一个准备工作,开一个dos窗口,进入<matlabroot>/<BR>bin/win32目录下(matlabroot为你机器上matlab安装的路径),打regsvr32 mwcomutil.dll<BR>,即对mwcomutil.dll进行注册(这个dll是matlab下作的任何com组件都要用到的dll),下面<BR>我们在其他编译器下调用时就可以用了。<BR> ^_^,是不是觉得做起com组件来很简单呢,matlab下可以给com组件中的类添加成员<BR>、事件、方法等,我这儿其实是给类sgltest添加了两个方法,怎么添加成员和方法可以参<BR>看matlab的com builder的帮助。<BR><BR>附录:split2rgb.m的源代码<BR>%%// 测试文件<BR>function [m_nHeight,m_nWidth,mOrigR,mOrigG,mOrigB]=Split2RGB(FileName)<BR><BR>%%// 读入一个Jpg文件,<BR>mOrigData=imread(FileName);<BR>%mDestData=imresize(mOrigData,0.5);<BR>imwrite(mOrigData,'c:\2.jpg');<BR><BR>%%// 用三个变量保存其R,G,B分量<BR>mOrigR=mOrigData(:,:,1);<BR>mOrigG=mOrigData(:,:,2);<BR>mOrigB=mOrigData(:,:,3);<BR><BR><BR>%%// 获得图象的高度,宽度<BR>[m_nHeight,m_nWidth]=size(mOrigR);<BR><BR>figure(1);<BR>set(gcf,'MenuBar','none')<BR>imshow(mOrigData);<BR>title(['Orginal Image:',FileName],'Color','b','FontSize',14);<BR>xlabel(['Height: ',num2str(m_nHeight),' Width :',num2str(m_nWidth)],'Color'<BR>,'b','FontSize',12);<BR><BR><BR>%%// 写param文件<BR>paraFName=[FileName(1:length(FileName)-4),'.param'];<BR>fid=fopen(paraFName,'w');<BR>fwrite(fid,m_nHeight,'uint32');<BR>fwrite(fid,m_nWidth,'uint32');<BR>fclose(fid);<BR><BR>%%// 写 R 分量文件<BR>RFName=[FileName(1:length(FileName)-4),'_R.rot'];<BR>fid=fopen(RFName,'w');<BR>fwrite(fid,mOrigR,'uint8');<BR>fclose(fid);<BR><BR>%%// 写 G 分量文件<BR>GFName=[FileName(1:length(FileName)-4),'_G.rot'];<BR>fid=fopen(GFName,'w');<BR>fwrite(fid,mOrigG,'uint8');<BR>fclose(fid);<BR><BR>%%// 写 B 分量文件<BR>BFName=[FileName(1:length(FileName)-4),'_B.rot'];<BR>fid=fopen(BFName,'w');<BR>fwrite(fid,mOrigB,'uint8');<BR>fclose(fid);<BR> |