http://blog.csdn.net/wangjie0377/article/details/7830405算法
CxImage下载地址:http://www.codeproject.com/KB/graphics/cximage/cximage600_full.zipwindows
做者:Davide Pizzolatoapp
CxImage简介less
CxImage是一个能够简便而快速地打开、保存、显示和转换图像文件的 C++类库,它能够用于MFC,能够打开,保存,显示,转换各类常见格式的图像文件,好比BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K 等格式的文件。能够实现BMP<->JPG,PNG <->TIFF格式等等的互相转换。CxImage不只能够实现图像文件的类型转换,还能够实如今内存图像数据的类型转换,而且使用很方便。除了文件格式的相互转换,它还提供了不少不少图像后处理的功能,好比图像模糊,锐化等等,功能很是强大和实用。另外,CxImage是开源的,并在zlib许可下发布,“若是你在你的产品中使用了这些源代码,虽然致谢不是必须的,可是却会获得众人的欣赏。”简单地说,你能够随意地使用这些代码,只要你不说它是你本身的就好了。ide
CxImage中的x,大约表明了丰富的图像格式支持和丰富的图像处理功能,能够说CxImage是图像处理的十全大补汤。函数
用CxImage实现的图像处理程序工具
开发环境:VC6, C++, Windows, MFC, Visual Studio, VS6, Dev学习
文件格式和连接的库:CxImage支持以下这些库的最新版本:
Zlib (1.2.3), Jasper ( 1.900.1), LibMNG (1.0.10), LibPNG (1.2.24). LibTIFF 3.8.2
j2k库(如今被称为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_LIN=0, DECODE_QUALITY_VNG=1, DECODE_QUALITY_PPG=2, DECODE_QUALITY_AHD=3).
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环境下编译经过。若是你在编译连接的时候,遇到像"unresolved external..."(没法找到外部符号…)这样的错误,请检查是否全部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菜单项所使用。在之前的版本中,这里有一个取整的错误,在某些状况下,白色(255,255,255)会被转换成(254,254,254)。在新的版本中,这个问题已经被修复了。
·Copy/Paste : 如今,新的粘贴功能支持元文件图像(例如,从Office应用程序中复制而来的图像)。这个示例内部使用了自定义的剪切板格式以测试Dump/Undump方法。Copy只工做在当前选区,可是你能够经过CxImage/Remove Selection 复制整幅图像。
·FloodFill : (/View/Tools/Flood Fill) 经过一个浮动的对话框,你能够测试色彩填充的颜色,误差,透明度和是否选择。当透明度为0而且选择区域功能启用的时候,这个功能就变现为"魔法棒",用于根据颜色选区某个区域。
·Graph data extraction : (/Filters/graph data extraction) 这个示例演示了如何从图像(从扫描仪获取或者从互联网下载所得)中提取数字信息。转换后的数据被粘贴到剪切板,同时能够被保存成文本文件或者Excel表格文件。
数据提取对话框
数据提取结果
·RedEyeRemove : (/Filters/Non Linear/Remove Red Eye) 去除红眼的功能在照片处理中常常用到。你 必须在红眼周围选择一个区域,而后去除红眼的功能就会对红色通道进行过滤,从而去掉照片中的红眼。红眼的选区是一个矩形区域,同时能够包括部分的虹膜(眼黑),过滤器会在以选区中点为中心的圆心区域工做,不会影响到选中的眼黑部分。
·SelectiveBlur / UnsharpMask : 这些非线性的滤镜能够增长图像的质量。SelectiveBlur能够去除二次噪声(好比JPEG图像中的伪影或者是数码相机的噪声),从而展现图像中的更多细节。而UnsharpMask能够加强图像的细节,可是却不会添加噪声。
·Custom linear filters : (/Filters/Linear/Custom) 一个用于测试新的滤镜功能核心的图像用户界面。
·Histogram : (/Colors/Histogram/...) 为了测试HistogramStretch(直方图),这个示例中提供了不少菜单项,经过不一样的方法(0 = luminance, 1 = linked channels , 2 = independent channels)来测试直方图功能。对于有噪声的图像,阈值(threshold)这个参数加强了算法的健壮性。半饱和度(Half Saturation)和全饱和度(Full Saturation)能够测试转换颜色空间(ConvertColorSpace),直方图(Histogram)和饱和度(Saturate)在YUV颜色空间对直方图的拉伸效果。
·Thresholding : ( /Colors/Threshold... and /Colors/Adaptive Threshold). 透明度阈值(OptimalThreshold)是一个新的用于查找二进制图像透明度阈值的新方法。可选的算法有:
1 = 最大类间方差 (Otsu);
2 = 基特勒和伊尔林格沃斯(Kittler & Illingworth);
3 = 最大熵(maximum entropy);
4 = 位差(potential difference);
0 = 平均全部方法 (默认状况下,这也是示例程序中所使用的方法);
"保留低于阈值的颜色"(preserve colors less than the threshold)的选项,将测试Threshold2方法。这对于过滤带有噪声背景的彩色图像颇有用。通过处理,咱们将获得一幅带有一致背景的彩色图像(噪声被去除)。AdaptiveThreshold是对方法OptimalThreshold的一个应用,它将建立不少阈值模板。AdaptiveThreshold对于有着不一致的灯光照射效果的图像,很是有用。对于这类图像,咱们不能简单地在整幅图像中使用某个单一的阈值。可是,若是咱们的参数设置得不对,咱们将获得一个很是差劲的处理结果。
·Add shadow : (/Filters/Add Shadow...) 这个菜单项的功能演示了如何将CxImage的多个小功能(选择(selections),高斯模糊( GaussianBlur),混合( Mix))组合使用,以达到常见的图像处理效果。
·Text smoothing : DrawStringEx 实现了一个新的选项CXTEXTINFO::smooth。咱们能够经过文本工具(位于/View/Tools/Text),选中抗锯齿("antialias")选项对这个功能进行测试。
相似的效果也一样能够利用TextBlur (/Filters/Non Linear/Text Blur)进行后处理得到。这是一个非线性的过滤器,它只对角或圆形的边缘起做用,从而不会影响到纵向或横向的线。下图展现了不一样平滑方法的实际效果:
CxImage库的结构
在整个库的继承树中,CxImage位于全部其余模块的顶部。这不是一个彻底的符合OOP的方式,可是至少从最初的版本一直到如今,它都工做得很好。如今想要改变整个结构,已经太晚了。可是,你老是可使用这些继承类来操做相应格式的图像,例如你可使用CxImageTIF来保存多页的TIFF文件。这样显得很是直观。
链接全部模块和C库的是CxFile。这是一个虚类,它提供了标准的方法,用于访问硬盘或者内存的文件数据。
CxImage的继承树
一个CxImage对象基本上对应于一幅位图,同时添加了一些额外的成员变量用于存储一些有用的信息。
CxImage类成员和操做
CxImage使用Doxygen 产生文档,可是因为一些历史的缘由,不少不太通用的功能尚未文档。类成员的参考资料,发布历史以及许可信息均可以在这里(here )找到。
支持的格式和选项
整个CxImage库很是大,在主要的头文件ximcfg.h中,你能够找到不少编译选项开关,用于启用或者禁用某些特定的图像格式或者功能。每一个JPG, PNG和 TIFF库将使得应用程序增长大约100KB的大小,同时,CxImage将使得应用程序增长大约50KB的大小。因此,为了减少你的应用程序的体积,你应该支持和连接你的应用程序确实须要的格式。
格式 | 定义#define | 须要的库 | 尺寸 [KB] |
BMP GIF ICO TGA PCX WBMP WMF SKA |
CXIMAGE_SUPPORT_BMP CXIMAGE_SUPPORT_GIF CXIMAGE_SUPPORT_ICO CXIMAGE_SUPPORT_TGA CXIMAGE_SUPPORT_PCX CXIMAGE_SUPPORT_WBMP CXIMAGE_SUPPORT_WMF CXIMAGE_SUPPORT_SKA |
内建 |
24 |
JPEG | CXIMAGE_SUPPORT_JPG | jpeg |
88 |
PNG | CXIMAGE_SUPPORT_PNG | png, zlib |
104 |
MNG | CXIMAGE_SUPPORT_MNG | mng, zlib, jpeg |
148 |
TIFF | CXIMAGE_SUPPORT_TIF | tiff, zlib, jpeg |
124 |
JBIG | CXIMAGE_SUPPORT_JBG | jbig |
28 |
PNM,PPM,PGM RAS |
CXIMAGE_SUPPORT_PNM CXIMAGE_SUPPORT_RAS |
jasper |
176 |
JPEG-2000 | CXIMAGE_SUPPORT_JP2 CXIMAGE_SUPPORT_JPC CXIMAGE_SUPPORT_PGX |
jasper |
176 |
RAW | CXIMAGE_SUPPORT_RAW | libdcr | 132 |
选项 | 定义#define | 尺寸[KB] |
CxImage核心 | 全部开关关闭 | 20 |
几何变换 (geometric transformations) |
CXIMAGE_SUPPORT_TRANSFORMATION | 16 |
图像处理
(image processing)
|
CXIMAGE_SUPPORT_DSP | 24 |
绘制和特殊的窗口函数
(drawing and windows specific functions)
|
CXIMAGE_SUPPORT_WINDOWS | 12 |
透明
(transparency)
|
CXIMAGE_SUPPORT_ALPHA | 4 |
选择
(selections)
|
CXIMAGE_SUPPORT_SELECTION | 4 |
多层支持
(multiple layers)
|
CXIMAGE_SUPPORT_LAYERS | < 4 |
图像格式转换
(graphic formats conversion)
|
CXIMAGE_SUPPORT_DECODE CXIMAGE_SUPPORT_ENCODE |
< 4 |
插值函数
(interpolation functions)
|
CXIMAGE_SUPPORT_INTERPOLATION | < 4 |
异常处理
(exception handling)
|
CXIMAGE_SUPPORT_EXCEPTION_HANDLING | < 4 |
在你的项目中使用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(项目设置)
在你的源代码中,你必须引入CxImage的头文件ximage.h。在你的代码中添加以下语句:#include "ximage.h"。
注意,不要混合debug和release模块,每一个配置必须使用各自相应的库文件。
在CxImage中添加自定义的函数
为CxImage添加一个新的图像处理函数并不困难。在这里,我将以CxImage::Jitter为例子,描述如何为CxImage添加自定义的函数。虽然这个函数很简单, 可是它却展现了使用CxImage时所须要注意的方方面面。
首先,咱们须要声明这个函数:
在ximage.h头文件的CXIMAGE_SUPPORT_DSP部分,你能够在public区域的任何部分声明这个函数。
如今,咱们开始定义这个函数:
示例:
如何转换一种格式到另一种格式
如何从资源中加载图像
如何解码内存中的图像
如何对内存中的图像编码
如何建立一副多页的TIFF
如何复制和粘贴图像
如何在图片框控件(Picture Box)中显示图像
译后序:
关于图像处理库,我相信你们有一个共同的疑问:这么多图像处理库,我该如何选择?在CSDN的blog中有这样一段文字,比较透彻地回答了这个问题,感谢做者的透彻解释:
"CxImage类库是一 个优秀的图像操做类库。它能够快捷地存取、显示、转换各类图像。有的读者可能说,有那么多优秀的图形库,如OpenIL,FreeImage, PaintLib等等,它们可谓是功能强大,齐全,不必用其它的类库。但我要说,这些类库基本上没有免费的,使用这些类库,你要被这样那样的许可协议所 束缚。
在这点上,CxImage类库是彻底免费的。另外,在使用上述类库时,你会遇到重重麻烦。由于它们大部分是平台无关的,且用C语言写成,有的还夹杂 着基本的C++ wrapper和成堆德编译选项的声明须要你去处理。而CxImage类库在这方面作得很好。还有让我最看好的,就是做者彻底公开了源代码。相对于那些封 装好的图形库和GDI+来讲,这一点使咱们能够进一步学习各类编解码技术,而再也不浮于各类技术的表面。"