当前位置:小鱼儿玄机二站 > 关于计算机 > CImg中文手册3,像素拼图实当代码

CImg中文手册3,像素拼图实当代码

文章作者:关于计算机 上传时间:2019-09-21

JavaScript像素拼图游戏

今昔发轫贰个基于CImg的前后相继的例子;演示了怎么样行使CImg来加载、创建图像实例;以及怎样体现图像和拍卖鼠标事件;下边包车型大巴程序完成了之类效果:加载一张彩色图像“lena.jpg”,然后试行平滑操作,并将它展现在窗口上,创设事件循环并在鼠标点击图片的时候,在另三个窗口绘制图片被点击相应的这一行像素点的ENCORE、G、B像素值总括音讯,so,let's go:

说明

  • 1.移动鼠标在网页方格里点击,拼出图形。
  • 2.万一对有个别点不乐意,再度点击,就可以消除。
  • 3.譬喻想再一次初叶,请点击这里: 只怕重新安装: 列 行

[Ctrl+A 全选 注:如需引进外界Js需刷新技能举行]

  #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;
  }

您也许感兴趣的稿子:

  • javascript依照像素点取地点示例
  • 使用纯JS完成像素慢慢显示的法子亲自过问

示例图(略)
下边是对上述代码的事无巨细表达:

  • #include "CImg.h"
    含有CImg的举世无双头文件;
  • using namespace cimg_library;
    选用CImg的主命名空间
  • int main() {
    概念主函数
  • CImg<unsigned char> image("lena.jpg"), visu(500,400,1,3,0);
    开创三个unsigned char花色的图像对象;第叁个图像对象从磁盘上的lena.jpg文件读取而来;此处lena.jpg和近来可实行文件放在同三个索引;同时ImageMagick必需已经安装,用来读取JPG格式的文书;
    第叁个图片对象visu开首化成三个5004001(2D图像)的彩色图像(有RAV4GB三个通道);最后三个参数表示图像visu不无像素全体置为0;因而visu将被伊始化为纯深紫;
  • const unsigned char red[3]={255,0,0}, green[3]={0,255,0}, blue[3]={0,0,255};
    此地以数组的方法定义了三种分歧的unsigned char品种的水彩变量;这个颜色变量将被用于接下去的绘图;
  • image.blur(2.5);
    对图像实行平整;使用方差为2.5的高斯平滑函数来平滑图像;注意,相当多CImg的函数有七个版本;不带get_前缀的函数(比如blur)是直接处理传入的图像对象;带get_前缀的函数(举个例子get_blur)会将拍卖后的图像对象回来(会花费越来越长的日子,因为必要极度的像素值拷贝操作,通过image = image.get_blur(2.5);那般的方式调用);
  • CImgDisplay main_disp(image,"Click a point"), draw_disp(visu,"Intensity profile");
    创办几个展现窗口,第二个用来显示输入图像,第二个呈现visu指标,展现相对应的新闻;
    私下认可景况下,CImg显示对象将拍卖客商鼠标和键盘事件;同期在Windows上,可以创造全屏展现窗口;
  • while (!main_disp.closed && !draw_disp.closed) {
    进去事件循环,当显示窗口关闭时,将退出事件循环;
  • main_disp.wait();
    在事变循环中等待接受main_disp的鼠标和键盘事件;
  • if (main_disp.button && main_disp.mouse_y>=0) {
    检查实验鼠标是不是点击在图像呈现区域,鼠标事件能够区分不一样体系的鼠标点击事件,不过在此并没有供给区分;
  • const int y = main_disp.mouse_y;
    获得被点击的图像的y座标;
  • visu.fill(0).draw_graph(image.get_crop(0,y,0,0,image.dimx()-1,y,0,0),red,0,256,0);
    该行演示了许多CImg类函数都帮助的链式调用管理;第二个函数fill(0)将图像全部像素值设为0,然后将visu对象回来,进而得以开展链式调用draw_graph()函数;draw_graph()函数在图像中绘制三个六头形;多边形数据出自image.get_crop函数的再次回到值,此处get_crop重临image对象的奥迪Q3通道第y行的数量。注意:CImg<T>对此彩色图像是4维数据;科雷傲,G,B通道的数量经过设置v=0,v=1,v=2获取到;
  • ** visu.draw_graph(image.get_crop(0,y,0,1,image.dimx()-1,y,0,1),green,0,256,0); **
    绘制鼠标点击行处原始图像的G通道音讯;
  • visu.draw_graph(image.get_crop(0,y,0,2,image.dimx()-1,y,0,2),blue,0,256,0).display(draw_disp);
    同上行,绘制鼠标点击行处原始图像的B通道音信;
  • ...till the end
    一连代码,没有须求解释。
    如上,使用CImg库可以写出精俨然观的代码,同时写出的代码能够健康运作在Windows和Unix系统中;
    CImg库提供了一各类的演示程序在源码的examples目录下,浮现了更加多轻松的CImg库方法应用示例;总能找到您必要示例;
    同时,CImg_test.cpp文件包括了非常多粗略而又多种化的关于CImg的使用示例;在该公文中,全部的CImg库中的类都被应用到,而且这一个代码都卓绝易读。提议从该公文最先上学怎么着运用CImg。

CImg图形绘制函数

从CImg的HTML文档里能找到详细的图样绘制函数列表和用法;使用前须求静心的几点:

  • 图形绘制函数会一贯绘制在流传参数中,况且会将盛传的图像实例再次来到,进而实现图形绘制函数的链式调用(后边有示范用法);绘制函数通过发出在2D图像上,不过也足以拓宽3D图像的绘图;
  • 制图的时候常见须要八个颜料参数,颜色参数必得以C数组的样式定义。

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

CImg定义了一雨后冬笋宏来简化繁琐的for循环嵌套逐点访谈和操作图像像素数量;使用CImg预约义的宏能够写出简洁的代码完结逐点访问和操作图像像素数量的效果与利益(副作用是一旦你不懂那些宏,基本看不懂使用CImg写出来代码);上边是那个宏的牵线,主要分为四类:

  • 逐点访谈图像像素
    cimg_map(img,ptr,T): 该宏定义了应用项目为T的指针ptr最末尾像素到最早阶像素逐个拜谒img的像素数量,ptr指针每一次指向图像像素数量;注意:
    • img总得是非空的cimg_library::CImg类实例变量,像素数据类型必得为T
    • ptr为T*体系的指针;
      该宏不平时应用,须要使用该宏的地点一般都能够用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的现实函数实行介绍。

本文由小鱼儿玄机二站发布于关于计算机,转载请注明出处:CImg中文手册3,像素拼图实当代码

关键词: