CImg:这个构造函数需要什么样的值?

时间:2017-10-05 15:48:56

标签: cimg

在文档(http://cimg.eu/reference/structcimg__library_1_1CImg.html#a24f3b43daa4444b94a973c2c3fff82c5)中,您可以读到N°7构造函数需要一组值来填充图像:

  

values =指向输入内存缓冲区的指针。

你必须知道我正在使用RGB 2D图像(所以,“正常”/“普通”图像)。

因此,我用Nx3值填充了一个矢量(=或多或少一个数组)。 N是像素数,数字“3”是因为我使用红色,绿色和蓝色。我将第一个值设置为0,将第二个值设置为0,将第三个值设置为255,这三个操作重复N次。 这就是为什么名为w的我的矢量看起来像这样:{0, 0, 255 ; 0, 0, 255 ; etc.}

我写了这个构造函数:cimg_library::CImg<unsigned char>(&w[0], width, height, 2, 3);说有3个通道,深度为2(因为我使用2D),并给出我的值(宽度,高度和像素)。

我应该获得一个完全蓝色的图像。但它是黄色的。为什么?我是否使用了矢量?

1 个答案:

答案 0 :(得分:1)

与大多数格式存储的&#34;带状交错的像素&#34; ,即RGBRGBRGB ...,CImg中的数据存储在&# 34;通过平面&#34; 进行频带交错,即所有红色成分是第一个,然后是所有绿色成分,然后是所有蓝色成分,所以它看起来像RRRGGGBBB。这被描述为here

所以,你的代码必须是这样的:

#include <vector>
#include "CImg.h"

using namespace std;
using namespace cimg_library;

int main()
{
    const int width=3;
    const int height=2;
    // 1. row - red, green, blue
    // 2. row - cyan, magenta, yellow

    // 6 pixels
    // Red plane first - red, green, blue, cyan, magenta, yellow
    // 255,0,0,0,255,255
    // Green plane next - red, green, blue, cyan, magenta, yellow
    // 0,255,0,255,0,255
    // Blue plane - red, green, blue, cyan, magenta, yellow
    // 0,0,255,255,255,0

    vector<unsigned char> w{
       255,0,0,0,255,255,
       0,255,0,255,0,255,
       0,0,255,255,255,0
    };

    CImg<unsigned char> image((unsigned char*)&w[0],width,height,1,3);
    image.save_pnm("result.pnm");
}

enter image description here

或者,如果您只想要一个纯蓝色图像,最简单的方法可能是使用一个像素的初始化器来实例化一个简单的1x1蓝色图像,然后调整它的大小:

    // Instantiate a 1x1 RGB image initialised to blue (last three values)
    CImg<unsigned char> blue(1,1,1,3,0,0,255);
    // Resize to larger image
    blue.resize(width,height);

另一种方法可能是:

// Create RGB image and fill with Blue
CImg<unsigned char> image(width,height,1,3);
image.get_shared_channel(0).fill(0);
image.get_shared_channel(1).fill(0);
image.get_shared_channel(2).fill(255);

另一种方法可能是:

CImg<unsigned char> image(256,256,1,3);

// for all pixels x,y in image
cimg_forXY(image,x,y) {
    image(x,y,0,0)=0;
    image(x,y,0,1)=0;
    image(x,y,0,2)=255;
}