CImg中文手册3

2016-11-06  本文已影响2821人  DeanWang

现在开始一个基于CImg的程序的例子;演示了如何使用CImg来加载、创建图像实例;以及如何显示图像和处理鼠标事件;下面的程序实现了如下功能:加载一张彩色图像“lena.jpg”,然后执行平滑操作,并将它显示在窗口上,创建事件循环并在鼠标点击图片的时候,在另一个窗口绘制图片被点击对应的这一行像素点的R、G、B像素值统计信息,so,let's go:

  #include "CImg.h"
  using namespace cimg_library;
  int main() {
    CImg<unsigned char> image("lena.jpg"), visu(500,400,1,3,0);
    const unsigned char red[3]={255,0,0}, green[3]={0,255,0}, blue[3]={0,0,255};
    image.blur(2.5);
    CImgDisplay main_disp(image,"Click a point"), draw_disp(visu,"Intensity profile");
    while (!main_disp.closed && !draw_disp.closed) {
      main_disp.wait();
      if (main_disp.button && main_disp.mouse_y>=0) {
        const int y = main_disp.mouse_y;
    visu.fill(0).draw_graph(image.get_crop(0,y,0,0,image.dimx()-1,y,0,0),red,0,256,0);
    visu.draw_graph(image.get_crop(0,y,0,1,image.dimx()-1,y,0,1),green,0,256,0);
    visu.draw_graph(image.get_crop(0,y,0,2,image.dimx()-1,y,0,2),blue,0,256,0).display(draw_disp);
    }
      }
    return 0;
  }

示例图(略)
下面是对上述代码的详细解释:

CImg图形绘制函数

从CImg的HTML文档里能找到详细的图形绘制函数列表和用法;使用前需要注意的几点:

使用CImg访问和操作图像像素

CImg定义了一系列宏来简化繁琐的for循环嵌套逐点访问和操作图像像素数据;使用CImg预定义的宏可以写出简洁的代码实现逐点访问和操作图像像素数据的功能(副作用是如果你不懂这些宏,基本看不懂使用CImg写出来代码);下面是这些宏的介绍,主要分为四类:

  CImg<float> img(320,200);
  cimg_map(img,ptr,float) { *ptr=0; }      // Equivalent to 'img.fill(0);'

cimg_mapoff(img,off): 该宏通过off访问像素数据,从图像起始到图像末尾;注意: off是内部循环变量;访问图像第一个像素位置时off=0,访问到图像最后一个像素位置时,off=img.size()-1。示例:

  CImg<float> img(320,200);
  cimg_mapoff(img,off) { img[off]=0; }  // Equivalent to 'img.fill(0);'

Github上CImg项目中已有详细的中文入门PDF文档,所以后续不再翻译入门文档。CImg.h最新版本有5万8千行代码,有时间对CImg的具体函数进行介绍。

上一篇 下一篇

猜你喜欢

热点阅读