CImg是一个跨平台的C++的图像处理库,提供了加载、处理、显示、保存等一系列功能,其中的图像处理功能尤其强大。
首先,建议先到欣赏一下使用CImg代码做的Demo,就是它使我这个没有图像处理经验的童鞋也心动得以致于研究了一星期^_^
主页地址:
下载地址:
下载时注意应该下载源码包,里面附带的大量的例程。而实际上CImg库只是一个头文件CImg.h,这个头文件里包含了CImg库所有的代码。
另外不要错过下载列表中的一个部分完成的《》。
CImg的Hello World
这段代码是从《CImg参考手册》里抄的,可以大致了解一下CImg的框架。
以VC为例:新建控制台程序,输入下面的代码。项目属性的链接器附加依赖项加入kernel.lib user32.lib gdi32.lib。最后,把CImg.h拷贝到项目路径下,即可成功编译运行
- #include "CImg.h"
- using namespace cimg_library;
- int main()
- {
-
- CImgchar> img(640,400,1,3);
-
- img.fill(0);
-
- unsigned char purple[] = { 255,0,255 };
-
-
- img.draw_text(100,100,"Hello World",purple);
-
- img.display("My first CImg code");
-
- return 0;
- }
运行这段代码,显示结果:
在CImg体系中,图像有x,y,z,v四个轴,前三个当然是3维空间的三个方向(知道了吧?CImg可以处理3维图像),第四个v一般表示色彩通道数,比如RGB三色就是3。
上面的代码每行的注释已经写得很详细,从代码里可以看出CImg处于namespace cimg_library名空间之下;模板类CImg<>是主要的图像类,提供了大量的图像处理方法。
在CImg库里,还有一个重要的类是CImgDisplay,它提供了一个显示窗口,不仅可以显示CImg的内容,还可以接收键盘鼠标事件,我们可以暂时把它看成是一个CImg专用窗体类。
CImg类介绍
CImg类提供的方法非常多,为了便于查阅,我用Doxygen重新生成了一份CImg库的说明文档,并做成chm格式,可以本文后面找到下载地址。
CImg模板类提供了图像的载入、保存、处理功能,是整个库的核心组件。它的声明如下:
template<typename T>
struct cimg_library::CImg;
模板参数T指明CImg中元素的类型。在自带的参考手册中称这些元素为像素(pixel),不过因为这里的像素和我们平时的像素概念稍微有点不同。因为前
面说过CImg体系中有xyzv四个轴,CImg手册称它为4维图像,把4维图像里的单个元素称为像素。而事实上第四维的v通常就是我们的色彩通道,所以
要在屏幕上显示出一个真正的像素往往要取同一xyz轴上所有v轴的点(所有色彩通道合成一个真正的彩色像素)。在本文中我决定把这个组成图像的最小单位称
为元素,由所有色彩通道v组成一个像素。
CImg类中的6个成员变量:
- unsigned int width, height, depth, dim;
- T *data;
- bool is_shared;
CImg类里的成员变量都是public的,我们可以直接存取它们,不过为了防止破坏完整性,建议使用成员方法如dimx(), dimy(), dimz(), dimv() 和ptr()来操作。
CImg的构造函数,大部分构造函数都很直白,就不列出了,可以查看手册,下面列出的是一些特殊的构造函数。
- CImg (
- const unsigned int dx,
- const unsigned int dy,
- const unsigned int dz,
- const unsigned int dv,
- const char *const values,
- const bool repeat_pattern)
- CImg (const CImg< T > &img, const bool shared)
- CImg (const CImg< t > &img, const char *const dimensions)
这个构造函数的dimensions参数由一串数字或转义符组成,分别对应x,y,z,v的大小。比如:
参数为"20 20 1 3"时新CImg对象的x,y,z,v的大小分别是20 20 1 3。
转义符以%开头,后缀可以是:
x, dx, dimx, width 表示img.width
y, dy, dimy, height 表示img.height
z, dz, dimz, depth 表示img.depth
v, dv, dimv, dim 表示img.dim
比如CImg(img, "%y %x 1 3");可以生成一个和img的宽高正好互换的CImg对象。
- CImg (const char *const filename)
CImg库本身支持BMP,RAW,HDR,INR,PGM,PPM,PAN,DLM格式
安装了ImageMagick(Unix系)后可支持JPG,GIF,PNG,TIF等多种格式
CImg也能使用jpeg库,zlib/png库,tiff库等来支持多种图像格式,只需编译时加入这些库即可。可以到这里下载这些库文件。
- CImg (const CImgDisplay &disp)
CImg部分成员方法
CImg提供了丰富的成员方法,在这里全部列出是不可能的,这里只作一些简单介绍。更多方法请参考手册。
- CImg< T > & assign ();
-
- CImg< T > & transfer_to (CImg< T > &img);
-
- CImg< T > & clear ();
-
- unsigned long size () const
-
- int dimx () const;
- int dimy () const;
- int dimz () const;
- int dimv () const;
-
- iterator begin ();
- iterator end ();
-
- T & first ();
- T & last ();
-
- T * ptr ();
- T * ptr (
- const unsigned int x,
- const unsigned int y=0,
- const unsigned int z=0,
- const unsigned int v=0);
-
- T & operator() (
- const unsigned int x,
- const unsigned int y=0,
- const unsigned int z=0,
- const unsigned int v=0);
-
- T & operator[] (const unsigned long off)
-
- long offset (
- const int x,
- const int y=0,
- const int z=0,
- const int v=0) const;
-
- T & at (const int off);
- T& atX(const int x, const int y, const int z, const int v);
- T& atXY(const int x, const int y, const int z, const int v);
- T& atXYZ(const int x, const int y, const int z, const int v);
- T& atXYZV(const int x, const int y, const int z, const int v);
-
- T & at (const int off, const T out_val);
- T& atX(const int x, const int y, const int z, const int v, const T out_val);
- T& atXY(const int x, const int y, const int z, const int v, const T out_val);
- T& atXYZ(const int x, const int y, const int z, const int v, const T out_val);
- T& atXYZV(const int x, const int y, const int z, const int v, const T out_val);
值得一提的是还有两种插值版本的at方法,分别是线性插值和三次插值。其中线性插值以linear_作为前缀,三次插值以cubic_作为前缀。参数和上面的类似,只是各轴位置的类型不是int而是float,这批方法会按插值法算出小数点位置上的数据。
到这里可以发现CImg类实际上提供了类似于vector容器的编程接口,这样我们的STL算法也能用于CImg的操作了,随后就可以看到库里有时也会把CImg类直接当作数据容器来使用。比如下面CImg中就有这个方法:
- CImg< charT > value_string (const char separator=',', const unsigned int max_size=0);
阅读(1463) | 评论(0) | 转发(0) |