我正在尝试获得CImg的子图像。据我所知,方法get_crop()做了我需要的,但我得到的子图像不包含我期望它们具有的像素值。
unsigned char* StringTextureGenerator::GetTexture(int &width, int &height)
{
cil::CImg<unsigned char>* tmp = new cil::CImg<unsigned char>(512, 512, 1, 4);
*tmp = _alphabet.get_crop(0, 0, 0, 0, 511, 511, 0, 3);
width = tmp->width();
height = tmp->height();
return tmp->data();
}
_alphabet CImg是512x512x1x4并包含rgba图像。对于测试,我试图得到整个图像x = 0-511,y = 0-511。 结果如下:
这是预期的结果。我从文件中加载了整个图像。
但是当我试图获得一个子图像时,会发生奇怪的事情。
unsigned char* StringTextureGenerator::GetTexture(int &width, int &height)
{
cil::CImg<unsigned char>* tmp = new cil::CImg<unsigned char>(256, 256, 1, 4);
*tmp = _alphabet.get_crop(0, 0, 0, 0, 255, 255, 0, 3);
width = tmp->width();
height = tmp->height();
return tmp->data();
}
这里我得到像素x = 0 - 255,y = 0 - 255,我希望它是图片的左上角。 结果如下:
正如你所看到的,我得到了每个128x128块的左上角。这不是我想要的。
答案 0 :(得分:1)
不确定您的代码是怎么回事,但这在我的机器上运行正常。我正在使用 CImg v169。我用它作为测试图像:
运行此代码:
#include <iostream>
#include "CImg.h"
using namespace cimg_library;
int main()
{
CImg<unsigned char> alphabet = CImg<unsigned char>("alphabet.png");
CImg<unsigned char> tmp = CImg<unsigned char>(512, 512, 1, 4);
//tmp = alphabet.get_crop(0, 0, 0, 0, 511, 511, 0, 3);
tmp = alphabet.get_crop(0, 0, 0, 0, 255, 255, 0, 3);
tmp.save_png("result.png");
}
得到这个,看起来对我来说是正确的:
我正在使用选项进行编译:
-Dcimg_use_png -lpng -lz