CxImgLib.dsw工作空间 在相同的工作空间中,你可以找到用于构建不同库和应用程序的项目: 要想在你自己的项目中使用CxImage,你必须编辑下面这些项目设置设置(针对Visual C++ 6.0): 在你的源代码中,你必须引入CxImage的头文件ximage.h。在你的代码中添加如下语句: 在CxImage中添加自定义的函数 为CxImage添加一个新的图像处理函数并不困难。在这里,我将以CxImage::Jitter为例子,描述如何为CxImage添加自定义的函数。虽然这个函数很简单, 但是它却展示了使用CxImage时所需要注意的方方面面。 首先,我们需要声明这个函数: bool
Jitter(long radius=2) 在ximage.h头文件的CXIMAGE_SUPPORT_DSP部分,你可以在public区域的任何部分声明这个函数。 现在,我们开始定义这个函数: bool
CxImage::Jitter(long radius) { // 检查图像是否合法,这应当是这个函数的第一行 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; }
|