在文档(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),并给出我的值(宽度,高度和像素)。
我应该获得一个完全蓝色的图像。但它是黄色的。为什么?我是否使用了矢量?
答案 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");
}
或者,如果您只想要一个纯蓝色图像,最简单的方法可能是使用一个像素的初始化器来实例化一个简单的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;
}