在你的项目中使用CxImage
如下图所示,CxImgLib.dsw工作空间展示了构建一个包含绝大多数功能和支持大多数图像格式的应用程序(demo.exe)所需要的所有库。你必须先编译所有的库,然后才可以链接你最终的应用程序。
CxImgLib.dsw工作空间
在相同的工作空间中,你可以找到用于构建不同库和应用程序的项目:
·CxImage : cximage.lib - 静态库
·CxImageCrtDll : cximagecrt.dll - DLL,不使用MFC
·CxImageMfcDll : cximage.dll - DLL,使用MFC
·Demo : 示例程序demo.exe,跟cximage.lib和C库链接。
·DemoDll : demodll.exe - 跟cximagecrt.dll链接
·libdcr,jasper,jbig,jpeg,png,tiff,zlib : 静态的C库
构建这些项目需要几分钟时间,当所有项目构建完成后,你可以选择demo项目并执行应用程序。
要想在你自己的项目中使用CxImage,你必须编辑下面这些项目设置设置(针对Visual C++ 6.0):
Project Settings(项目设置)
|- C/C++
| |- Code Generation
| | |- 运行时库 : 多线程DLL(所有链接的库都必须使用相同的设置)
| | |- 结构成员对齐方式 : 所有链接的库都必须相同
| |- 预编译头文件 : 不使用预编译头文件
| |- 预处理器:
| |- 添加额外的包含(Include)路径: ..\cximage
|- Link
|- General
|- Object/library modules(附加的依赖库): ../png/Debug/png.lib
../raw/Debug/libdcr.lib
../jpeg/Debug/jpeg.lib
../zlib/Debug/zlib.lib
../tiff/Debug/tiff.lib
../jasper/Debug/jasper.lib
../cximage/Debug/cximage.lib ...
在你的源代码中,你必须引入CxImage的头文件ximage.h。在你的代码中添加如下语句:
#include "ximage.h"。
注意,不要混合debug和release模块,每个配置必须使用各自相应的库文件。
在CxImage中添加自定义的函数
为CxImage添加一个新的图像处理函数并不困难。在这里,我将以CxImage::Jitter为例子,描述如何为CxImage添加自定义的函数。虽然这个函数很简单, 但是它却展示了使用CxImage时所需要注意的方方面面。
首先,我们需要声明这个函数:
在ximage.h头文件的CXIMAGE_SUPPORT_DSP部分,你可以在public区域的任何部分声明这个函数。
现在,我们开始定义这个函数:
{
// 检查图像是否合法,这应当是这个函数的第一行
if (!pDib) return false;
// 局部变量
long nx,ny;
// 临时图像,用于存储算法的部分结果
CxImage tmp(*this,pSelection!=0,true,true);
// 限制函数仅仅作用在选区(通过Selection...()函数定义)的最小区域
// 这将加快整个循环的速度,提高算法效率
long xmin,xmax,ymin,ymax;
if (pSelection){
xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right;
ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top;
} else {
xmin = ymin = 0;
xmax = head.biWidth; ymax=head.biHeight;
}
// 主循环 : 垂直方向扫描图像
for(long y=ymin; y <ymax; y++){
// 监视循环的进度
info.nProgress = (long)(100*y/head.biHeight);
// 检查应用程序是否已经退出
if (info.nEscape) break;
// 主循环 : 水平方向扫描图像
for(long x=xmin; x<xmax; x++){
// 如果选区功能启用了,则仅仅处理选区内部的像素
#if CXIMAGE_SUPPORT_SELECTION
if (SelectionIsInside(x,y))
#endif //CXIMAGE_SUPPORT_SELECTION
{
// 主算法
nx=x+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2));
ny=y+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2));
if (!IsInside(nx,ny)) {
nx=x;
ny=y;
}
// 保存结果到临时图像中.
// 如果可以,24位图像请使用PixelColor,
// 而8,4和1位图像请使用PixelIndex,这样可以加快速度。
if (head.biClrUsed==0){
tmp.SetPixelColor(x,y,GetPixelColor(nx,ny));
} else {
tmp.SetPixelIndex(x,y,GetPixelIndex(nx,ny));
}
// 如果启用了透明度功能,则处理透明图层中的像素
#if CXIMAGE_SUPPORT_ALPHA
tmp.AlphaSet(x,y,AlphaGet(nx,ny));
#endif //CXIMAGE_SUPPORT_ALPHA
}
}
}
// 保存结果并退出
Transfer(tmp);
return true;
}