【VC++开源代码栏目提醒】:本文主要为网学会员提供“CxImage图像处理类库说明 - 教育”,希望对需要CxImage图像处理类库说明 - 教育网友有所帮助,学习一下!
CxImage 图像处理类库 CxImage 是一个可以用于 MFC 的 C 图像处理类库类,它可以打开,保存,显示,转换各种常见格式的图像文件,比如 BMPJPEG GIF PNG TIFF MNG ICO PCX TGA WMF WBMP JBG J2K 等格式的文件。
可以实现 BMPlt-gtJPG,PNG ltgtTIFF 格式等等的互相转换。
CxImage 不仅可以实现图像文件的类型转换,还可以实现在内存图像数据的类型转换,并且使用很方便。
除了文件格式的相互转换,它还提供了很多很多图像后处理的功能,比如图像模糊,锐化等等,功能非常强大和实用。
CxImage 中的 x,大约代表了丰富的图像格式支持和丰富的图像处理功能,可以说 CxImage 是图像处理的十全大补汤。
用 CxImage 实现的图像处理程序 开发环境:
VC6 C Windows MFC Visual Studio VS6 Dev 简介和许可 CxImaage 是一个可以简便而快速地打开,保存,显示和转换图像文件的 C 类库。
CxImage 类库是免费的。
对于 TIFF,JPEG,PNG 和 ZLIB,quot如果你在你的产品中使用了这些源
代码,虽然致谢不是必须的,但是却会得到众人的欣赏。
quot CxImage 是
开源的并在 zlib 许可下发布。
简单地说,你可以随意地使用这些
代码,只要你不说它是你自己的就行了。
文件格式和链接的库 CxImage 支持如下这些库的最新版本: Zlib 1.2.3 Jasper 1.900.1 LibMNG 1.0.10 LibPNG 1.2.24. LibTIFF 3.8.2j2k 库(现在被称为 openjpeg)和相关的类 CxImageJ2K 已经从项目中删除。
JPEG2000 格式的文件由 Jasper 和 CximageJAS 来支持。
Cximage 6.00 提供了一个新的类 CximageRAW 和新的库 LibDCR,用于读取来自数码相机的 RAW 图像。
常见的文件扩展名有:RAW CRW NEF CR2 DNG ORF ARW ERF 3FR DCR X3F MEF RAF MRW PEF SR2。
CximageRAW 提供了对图像的基本解码功能,它唯一的可选参数可以由 SetCodecOption 进行设置,以对插值质量进行可控制 。
可 选 的 选 项 有 DECODE_QUALITY_LIN0 DECODE_QUALITY_VNG1 DECODE_QUALITY_PPG2DECODE_QUALITY_AHD3. CximagePNG:现在可以读取所有 PNG_COLOR_TYPE_类型。
但是,每个通道含有超过 8 位像素深度的 PNG 文件,会被转换到 8 位,这是 CxImage 的一个主要限制。
CxImageGIF:现在能够更好地支持对动态 GIF 图像的读取,通过 SetRetreiveAllFrames 设置属性,可以同时对图像中的所有帧进行解码。
在 CxImage 的示例项目中,展示了如何实现这一选项,并展示了如何播放一副 GIF 动画。
CxImageBMP: 支持对 32 位图像的读写支持 Alpha 通道 CxImageICO: 支持对 Vista PNG 图标的读写;添加对多页图标的支持。
CxImageMNG: 支持对 MNG Alpha 图层的读取。
CxImageSKA: 新的用于支持 SKA 图像格式的类,这种图像通常用在视频租赁软件中。
CxImageJPG: 为 JPEG 图像格式的二次采样提供了 新的选项。
ENCODE_SUBSAMPLE_422,ENCODE_SUBSAMPLE_444,默认情况下是 高采样率的 4:1:1 。
当然,也可以被设置成中等的 4:2:2 或者低等的 4:4:4。
下图展示了不同采样率下,在压缩图像中所产生的不同数量的伪影。
在压缩有着明显轮廓的图像的时候,采用 4:4:4 的采样率有助于减少轮廓的伪影。
可移植性 所有的类和项目都通过了不同编译器的测试,包括从
VC 6 到
VC 2008 的微软系列编译器,Borland C Builder 3 和 6,同时部分地支持 wxDev-C 和 MinGW。
所有的库都支持 UNICODE 和非 UNICODE 两个版本。
(感谢 Eric Jesover) 对于第一次使用的用户,你可以使用一个轻量级的版本cximage600_lite。
这个版本去除了 C 库,但是添加了一个简单的示例项目。
所有控制台示例demo2和 CxImageCrtDll 项目可以在
VC Express2005 和 Microsoft Platform SDK 环境下编译通过。
如果你在编译链接的时候,遇到像quotunresolved external...quot无法找到外部符号…这样的错误,请检查是否所有 C 库都被编译了。
或者手动地添加 gdi32.lib 和 user32.lib 为项目的依赖库。
同时,CxImage 也可以在 Pocket PC 2003 上工作。
在 CxImage 中,为
VC 2005 编译器提供了一个可以工作的版本和相应的实例cximage600_ce。
对于旧式的嵌入式
VC 编译器,最主要的限制是无法支持对异常的处理。
为了解决这个问题,相应的异常处 理 语 句 try , throw 和 catch 已 经 被 定 义 在 ximadef.h 中 的 三 个 宏 取 代 , 同 时 还 定 义 了CXIMAGE_SUPPORT_EXCEPTION_HANDLING。
通过这样的方法,取消对异常处理的支持,可以成功编译链接整个库。
虽然这个解决办法不是那么优雅,但是当异常处理被取消的时候,对
代码的影响是最小的。
同时,当异常处理被启用的时候,同样不会造成源
代码的修改与变动。
对于平台之间 little-endian 和 big-endian 的兼容性, 由 对于内建支持的图像文件格式bmp ico tga pcx gif ska, ntohs 和 ntohl控制。
示例 大多数新的特性可以在 CxImage 的主要示例程序中尝试和体验。
这个示例程序只是一个测试平台,虽然它提供很多有用的特性,但是它实在不是一个严谨的应用程序。
CQuantizer : 这个类被 DecreaseBpp 菜单项所使用。
在以前的版本中,这里有一个取整的错误,在某些情况下,白色255255255会被转换成254254254。
在新的版本中,这个问题已经被修复了。
Copy/Paste : 现在,新的粘贴功能支持元文件图像(例如,从 Office 应用程序中复制而来的图像)。
这个示例内部使用了自定义的剪切板格式以测试 Dump/Undump 方法。
Copy 只工作在当前选区,但是你可以通过 CxImageRemove Selection 复制整幅图像。
FloodFill : ViewToolsFlood Fill 通过一个浮动的对话框,你可以测试色彩填充的颜色,偏差,透明度和是否选择。
当透明度为 0 并且选择区域功能启用的时候,这个功能就变现为quot魔法棒quot,用于根据颜色选区某个区域。
Graph data extraction : Filtersgraph data extraction 这个示例演示了如何从图像(从扫描仪获取或者从互联网下载所得)中提取数字信息。
转换后的数据被粘贴到剪切板,同时可以被保存成文本文件或者 Excel 表格文件。
数据提取对话框数据提取结果 RedEyeRemove : FiltersNon LinearRemove Red Eye 去除红眼的功能在照片处理中经常用到。
你 必须在红眼周围选择一个区域,然后去除红眼的功能就会对红色通道进行过滤,从而去掉照片中的红眼。
红眼的选区是一个矩形区域,同时可以包括部分的虹膜眼黑,过滤器会在以选区中点为中心的圆心区域工作,不会影响到选中的眼黑部分。
SelectiveBlur / UnsharpMask : 这些非线性的滤镜可以增加图像的质量。
SelectiveBlur 可以去除二次噪声(比如 JPEG 图像中的伪影或者是数码相机的噪声),从而展示图像中的更多细节。
而 UnsharpMask 可以增强图像的细节,但是却不会添加噪声。
Custom linear filters : FiltersLinearCustom 一个用于测试新的滤镜功能核心的图像用户界面。
Histogram : ColorsHistogram... 为了测试 HistogramStretch直方图,这个示例中提供了很多菜单项,通过不同的方法0 luminance 1 linked channels 2 independent channels来测试直方图功能。
对于有噪声的图像,阈值threshold这个参数增强了算法的健壮性。
半饱和度Half Saturation和全饱和度Full Saturation可以测试转换颜色空间ConvertColorSpace,直方图Histogram和饱和度Saturate在 YUV 颜色空间对直方图的拉伸效果。
Thresholding : ColorsThreshold... and ColorsAdaptive Threshold. 透明度阈值OptimalThreshold是一个新的用于查找二进制图像透明度阈值的新方法。
可选的算法有:1 最大类间方差 Otsu2 基特勒和伊尔林格沃斯Kittler amp Illingworth3 最大熵maximum entropy4 位差potential difference0 平均所有方法 默认情况下,这也是示例程序中所使用的方法 quot保留低于阈值的颜色quotpreserve colors less than the threshold的选项,将测试 Threshold2 方法。
这对于过滤带有噪声背景的彩色图像很有用。
经过处理,我们将得到一幅带有一致背景的彩色图像噪声被去除。
AdaptiveThreshold 是对方法 OptimalThreshold的一个应用,它将创建很多阈值模板。
AdaptiveThreshold 对于有着不一致的灯光照射效果的图像,非常有用。
对于这类图像,我们不能简单地在整幅图像中使用某个单一的阈值。
但是,如果我们的参数设置得不对,我们将得到一个非常差劲的处理结果。
Add shadow : FiltersAdd Shadow... 这个菜单项的功能演示了如何将 CxImage 的多个小功能选择selections,高斯模糊 GaussianBlur,混合 Mix组合使用,以达到常见的图像处理效果。
Text smoothing : DrawStringEx 实现了一个新的选项 CXTEXTINFO::smooth。
我们可以通过文本工具位于ViewToolsText,选中抗锯齿quotantialiasquot选项对这个功能进行测试。
类似的效果也同样可以利用 TextBlur FiltersNon LinearText Blur进行后处理获得。
这是一个非线性的过滤器,它只对角或圆形的边缘起作用,从而不会影响到纵向或横向的线。
下图展示了不同平滑方法的实际效果:CxImage 库的结构在整个库的继承树中,CxImage 位于所有其他模块的顶部。
这不是一个完全的符合 OOP 的方式,但是至少从最初的版本一直到现在,它都工作得很好。
现在想要改变整个结构,已经太晚了。
但是,你总是可以使用这些继承类来操作相应格式的图像,例如你可以使用 CxImageTIF 来保存多页的 TIFF 文件。
这样显得非常直观。
连接所有模块和 C 库的是 CxFile。
这是一个虚类,它提供了标准的方法,用于访问硬盘或者内存的文件数据。
CxImage 的继承树一个 CxImage 对象基本上对应于一副位图,同时添加了一些额外的成员变量用于存储一些有用的信息。
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 szLastError256 //调试信息,最后的错误信息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 值是启用的,//则这个变量为 truebool bEnabled //启用绘制函数long xOffsetlong yOffsetDWORD dwEncodeOption //GIF TIF 使用:// 0def.1unc2fax33fax4// 4pack5jpgRGBQUAD last_c //用于优化 GetNearestIndexBYTE last_c_indexbool last_c_isvalidlong nNumLayersDWORD dwFlags CXIMAGEINFO CxImage 的不同层 CxImage 对象同样是图层的集合,每个图层的缓冲区只在需要的时候申请。
CxImage::pDib 是背景图像。
CxImage::pAlpha 是透明层。
CxImage::pSelection 是选区层,用于创建要对图像的感兴趣区域进行处理的选择区域。
在这三个特殊层之上,你可以添加通用的其他层,这些层都保存在 CxImage::ppLayers 中。
通用层也是完整的 CxImage 对象,所以你可以创建复杂的嵌套层。
CxImage::ppFrames 为动态图像GIF所预留。
CxImage 类成员和操作 CxImage 使用 Doxygen 产生文档,但是由于一些历史的原因,很多不太通用的功能还没有文档。
类成员的参考资料,发布历史以及许可信息都可以在这里here 找到。
支持的格式和选项 整个 CxImage 库非常大,在主要的头文件 ximcfg.h 中,你可以找到很多编译选项开关,用于启用或者禁用某些特定的图像格式或者功能。
每个 JPG PNG 和 TIFF 库将使得应用程序增加大约 100KB 的大小,同时,CxImage 将使得应用程序增加大约 50KB的大小。
所以,为了减小你的应用程序的体积,你应该支持和链接你的应用程序确实需要的格式。
格式 定义define 需要的库 尺寸 KBBMP CXIMAGE_SUPPORT_BMPGIF CXIMAGE_SUPPORT_GIFICO CXIMAGE_SUPPORT_ICOTGA CXIMAGE_SUPPORT_TGAPCX CXIMAGE_SUPPORT_PCX 内建 24WBMP CXIMAGE_SUPPORT_WBMPWMF CXIMAGE_SUPPORT_WMFSKA CXIMAGE_SUPPORT_SKAJPEG CXIMAGE_SUPPORT_JPG jpeg 88PNG CXIMAGE_SUPPORT_PNG png zlib 104MNG CXIMAGE_SUPPORT_MNG mng zlib jpeg 148 TIFF CXIMAGE_SUPPORT_TIF tiff zlib jpeg 124 JBIG CXIMAGE_SUPPORT_JBG jbig 28 PNMPPMPGM CXIMAGE_SUPPORT_PNM RAS CXIMAGE_SUPPORT_RAS jasper 176 CXIMAGE_SUPPORT_JP2 JPEG-2000 CXIMAGE_SUPPORT_JPC jasper 176 CXIMAGE_SUPPORT_PGX RAW CXIMAGE_SUPPORT_RAW libdcr 132选项 定义define 尺寸KBCxImage 核心 所有开关关闭 20几何变换 CXIMAGE_SUPPORT_TRANSFORMATION 16geometric transformations图像处理 image processing CXIMAGE_SUPPORT_DSP 24绘制和特殊的窗口函数 drawing and windows CXIMAGE_SUPPORT_WINDOWS 12specific functions选项 定义define 尺寸KB透明 transparency CXIMAGE_SUPPORT_ALPHA 4选择 selections CXIMAGE_SUPPORT_SELECTION 4多层支持 multiple layers CXIMAGE_SUPPORT_LAYERS lt 4 CXIMAGE_SUPPORT_DECODE图像格式转换 graphic formats conversion lt 4 CXIMAGE_SUPPORT_ENCODE插值函数 interpolation functions CXIMAGE_SUPPORT_INTERPOLATION lt 4异常处理 exception handling CXIMAGE_SUPPORT_EXCEPTION_HANDLING lt 4 在你的项目中使用 CxImage 如下图所示,CxImgLib.dsw 工作空间展示了构建一个包含绝大多数功能和支持大多数图像格式的应用程序demo.exe所需要的所有库。
你必须先编译所有的库,然后才可以链接你最终的应用程序。
CxImgLib.dsw 工作空间 在相同的工作空间中,你可以找到用于构建不同库和应用程序的项目:CxImage : cximage.lib - 静态库CxImageCrtDll : cximagecrt.dll - DLL,不使用 MFCCxImageMfcDll : cximage.dll - DLL,使用 MFCDemo : 示例程序 demo.exe,跟 cximage.lib 和 C 库链接。
DemoDll : demodll.exe - 跟 cximagecrt.dll 链接libdcrjasperjbigjpegpngtiffzlib : 静态的 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 quotximage.hquot。
注意,不要混合 debug 和 release 模块,每个配置必须使用各自相应的库文件。
在 CxImage 中添加自定义的函数 为 CxImage 添加一个新的图像处理函数并不困难。
在这里,我将以 CxImage::Jitter 为例子,描述如何为 CxImage 添加自定义的函数。
虽然这个函数很简单, 但是它却展示了使用 CxImage 时所需要注意的方方面面。
首先,我们需要声明这个函数:Jitterlong radius2在 ximage.h 头文件的 CXIMAGE_SUPPORT_DSP 部分,你可以在 public 区域的任何部分声明这个函数。
现在,我们开始定义这个函数:CxImage::Jitterlong radius// 检查图像是否合法,这应当是这个函数的第一行if pDib return false// 局部变量long nxny// 临时图像,用于存储算法的部分结果CxImage tmpthispSelection0truetrue// 限制函数仅仅作用在选区(通过 Selection...函数定义)的最小区域// 这将加快整个循环的速度,提高算法效率long xminxmaxyminymaxif pSelectionxmin info.rSelectionBox.left xmax info.rSelectionBox.rightymin info.rSelectionBox.bottom ymax info.rSelec.
上一篇:
QtCreator使用体会与小技巧
下一篇:
科研管理杂志简介