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进行各种图像处理了。


发布评论