类似的效果也同样可以利用TextBlur (\Filters\Non Linear\Text Blur)进行后处理获得。这是一个非线性的过滤器,它只对角或圆形的边缘起作用,从而不会影响到纵向或横向的线。下图展示了不同平滑方法的实际效果: CxImage库的结构 在整个库的继承树中,CxImage位于所有其他模块的顶部。这不是一个完全的符合OOP的方式,但是至少从最初的版本一直到现在,它都工作得很好。现在想要改变整个结构,已经太晚了。但是,你总是可以使用这些继承类来操作相应格式的图像,例如你可以使用CxImageTIF来保存多页的TIFF文件。这样显得非常直观。 连接所有模块和C库的是CxFile。这是一个虚类,它提供了标准的方法,用于访问硬盘或者内存的文件数据。 class
CxImage { ... protected: void* pDib; //包含文件头,调色板和像素数据 BITMAPINFOHEADER head; //标准文件头 CXIMAGEINFO info; //扩展信息 BYTE* pSelection; //选区 BYTE* pAlpha; //alpha通道 CxImage** ppLayers; //普通层 CxImage** ppFrames; //动画的帧 } CxImage::head 是位图文件的文件头,而CxImage::pDib就是一个普通的位图(就像你在CxImageBMP::Encode中看到的一样)。 CxImage::info 是一个方便的信息容器。这些信息被不同的文件格式所共享,同时供所有成员函数访问。 typedef struct tagCxImageInfo { DWORD dwEffWidth; //双字节对齐宽度 BYTE* pImage; //图像数据 void* pGhost; //如果这是一个备份(ghost), //则pGhost指向它的原始对象 DWORD dwType; //原始图像格式 char szLastError[256]; //调试信息,最后的错误信息 long nProgress; //进度 long nEscape; //取消 long nBkgndIndex; //GIF, PNG, MNG使用 RGBQUAD nBkgndColor; //RGB透明使用 BYTE nQuality; //JPEG使用 long nFrame; //TIF, GIF, MNG使用,表示当前活动帧 long nNumFrames; //TIF, GIF, MNG使用,表示总帧数 DWORD dwFrameDelay; //GIF, MNG使用,表示帧的延迟 long xDPI; //水平分辨率 long yDPI; //垂直分辨率 RECT rSelectionBox; //对象的外包围框 BYTE nAlphaMax; //最大透明度 bool bAlphaPaletteEnabled; //如果调色板中的alpha值是启用的, //则这个变量为true bool bEnabled; //启用绘制函数 long xOffset; long yOffset; DWORD dwEncodeOption; //GIF, TIF使用: // 0=def.1=unc,2=fax3,3=fax4, // 4=pack,5=jpg RGBQUAD last_c; //用于优化GetNearestIndex BYTE last_c_index; bool last_c_isvalid; long nNumLayers; DWORD dwFlags; } CXIMAGEINFO; |