2024年3月6日发(作者:)

用MFC封装图象处理Dll

GeoTrans目录下为封装Dll的Visual C++项目。其中封装了10个常用图像处理的API函数,方便VC、VB、Delphi等开发工具调用。GeoInVB目录中是一个VB项目,对封装的Dll进行调用演示。

封装之前的Visual C++代码仅能进行256色图像的处理,现在封装的各API函数可以处理24位彩色图像。

这10个API函数分别为:

MirrorBmp

TransposeBmp

RotateBmp

ZoomBmp

LinerTransBmp

MedianFilterBmp

GradSharpBmp

RandomNoiseBmp

SaltNoiseBmp

//图像水平镜像 、图像垂直镜像

//图像转置

//图像缩放

//图像旋转

//图像反色

//中值滤波

//梯度锐化

//图像中加入随机噪声

//图像中加入椒盐噪声

Dll的封装方法和步骤如下:

1、 新建一个MFC Extension DLL类型的VC项目,指定工程名称为GeoTrans。在下一步中选择Regular DLL with MFC statically linked,Appliward将自动生成DLL框架。

2、 添加文件和文件及相应头文件,其中:

 DIBAPI库函数实现了类的一些基本操作,并在其中增加1个DIBfromBitmap函数,其功能是从GDI位图句柄中读出DIB数据;

 TransDIB库函数是进行图象数据处理变换的API函数。对设备句柄和图象句柄读出的DIB数据只有在24位色转换模式下才能不失真,而封装前的DIB的变换只支持8位色DIB,因此TransDIB进行了改进使得函数处理支持24位色DIB。

3、 打开文件,在其中添加include语句将上述两种库函数添加进来,然后在该文件后面加入可导出的API函数。

由于该Dll的需要考虑能够让VB/Delphi进行调用从而进行图象处理,所以Dll需要从

设备句柄和图象句柄读出DIB数据,然后对DIB数据进行一定的变换,最后再将变换后的DIB数据映射到目的设备句柄上显示出来(即处理结果显示于目的图片框控件中)。

导出函数是通过对前面介绍的库函数进行调用来完成上述任务的。其实现格式类似于:

int _stdcall MirrorBmp(HDC hdcSrc,HBITMAP hbmpSrc,HDC hdcDest,BOOL bDirection)

{

int cx,cy;

//读取DIB信息

LPBYTE lpDIB=DIBfromBitmap(hdcSrc,hbmpSrc);

if(lpDIB==NULL)

return -1;

LPBYTE lpDIBits =(LPBYTE)lpDIB+sizeof(BITMAPINFOHEADER)

+ ::PaletteSize((LPSTR)lpDIB);

BITMAPINFOHEADER * lpBmpih=(BITMAPINFOHEADER *)lpDIB;

cx=lpBmpih->biWidth;

cy=lpBmpih->biHeight;

//对DIB进行转换

if(!MirrorDIB((LPSTR)lpDIBits, cx, cy, bDirection))

return -2;

//将变化后的信息放到目的句柄

if(SetDIBitsToDevice(hdcDest,0,0,cx,cy,0,0,0,cy,lpDIBits,(BITMAPINFO*)lpDIB,DIB_RGB_COLORS)==0)

return -3;

return 1;

}

4、 打开文件,在EXPORT下面添加导出的API函数的声明如下:

EXPORTS

MirrorBmp

TransposeBmp

RotateBmp

ZoomBmp

LinerTransBmp

MedianFilterBmp

GradSharpBmp

SaltNoiseBmp

RandomNoiseBmp

5、 编译工程获得DLL文件。

6、 把从工程的DEBUG目录拷贝到操作系统目录下或者将其拷贝到VB工程生成的Exe所在目录下。这样VB(或者是Delphi等)程序就可以调用该Dll进行各种图像处理了。