Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于二值图像数据的CImg_C++_Image_Cimg - Fatal编程技术网

C++ 基于二值图像数据的CImg

C++ 基于二值图像数据的CImg,c++,image,cimg,C++,Image,Cimg,在使用X11 xGetImage拍摄快照后,我创建了一个二进制文件,并将数据字段的内容存储在了中(该文件已压缩。请解压缩)。现在,我正在玩一玩CImg,学习它的用法 第一个问题 所以,我使用load_rgba函数在这个二进制数据上尝试了CImg CImgDisplay *disp; CImg <float>img1,img2; //I don't why,it only works with float, with int it gives gray colour and with

在使用X11 xGetImage拍摄快照后,我创建了一个二进制文件,并将数据字段的内容存储在了中(该文件已压缩。请解压缩)。现在,我正在玩一玩CImg,学习它的用法

第一个问题

所以,我使用load_rgba函数在这个二进制数据上尝试了CImg

CImgDisplay *disp;
CImg <float>img1,img2; //I don't why,it only works with float, with int it gives gray colour and with unsigned int it gives black foreground
img2 = img1.load_rgba("imagedata",1366,768);  //1366 X 768 is the dimension of my image that i got from X11
disp = new CImgDisplay(1024,768,"window");
disp->display(img2);
为什么它只在为模板传递float时才起作用??

第二个问题 现在我想,使用CImg的方法是首先自己读取文件,然后使用此代码将缓冲区指针交给CImg

int main() {
    char *data;
    int size = 1366*768*4;   //1366 X 768 is the dimension of my image that i got from X11 and 4 is number of bits per pixel
    ifstream file ("imagedata", ios::in|ios::binary|ios::ate);
    data = new char[size];
    file.read (data, size);

    CImgDisplay *disp;
    CImg <float>img3(data,1366,768,1,4);
    disp = new CImgDisplay(1024,768,"window");
    disp->display(img3);
    getchar();
    return 0;   
}
intmain(){
字符*数据;
int size=1366*768*4;//1366 X 768是我从X11获得的图像的维度,4是每个像素的位数
ifstream文件(“imagedata”,ios::in | ios::binary | ios::ate);
数据=新字符[大小];
file.read(数据、大小);
CImgDisplay*显示;
CImg img3(数据1366768,1,4);
disp=新的CImgDisplay(1024768,“窗口”);
显示->显示(img3);
getchar();
返回0;
}
在相同的imagedata上运行此代码(与第一种情况相同),我得到的只是一个黑色窗口。此外,设置第四个参数(即深度(z))会导致分段错误

我做错了什么

第二个问题现在我想,通过首先读取文件来使用CImg 然后用这个函数将缓冲区指针交给Cimg 代码

CImg数据格式:

如果您想从缓冲区手动初始化CImg对象,您应该自己设置这个数组

这是jpeg图像的一个示例,对于其他格式,您可以检查源(函数名称:\u load\u png\u load\u jpeg等):


关于Q1-为什么要将二进制文件作为浮点读取?根据传递给getXImage的选项,您应该有8位、16位或32位无符号整数。这很好,我忘了添加这个问题,实际上我从int开始,但这导致了灰色图像,然后在谷歌搜索的某个地方,我发现了这种在模板中传递浮点的方法,它确实有效,我不知道为什么。我建议,如果您可以使用我在链接中附加的代码和示例图像,这样您就可以实际看到,实际发生了什么,并可能对其进行更仔细的评估…..谢谢,我没有CImg设置,因此我只是在这里发表评论。如果您从X读取32位图像并将其读入4字节CImg浮点,您将看到舍入错误导致的质量损失。您之前使用的是无符号整数还是有符号整数?但这会导致CImgDisplay中出现灰色框,在您的评论之后,我尝试使用无符号整数,这会导致图像变黑。。。。任何想法啊,打印出一两个像素的值,并确保该值与您期望的值相匹配。或者,创建一个“测试图像”,您可以在其中设置特定位置的特定值和类型。很简单,但这是一个很好的方法来了解你在处理什么。
int main() {
    char *data;
    int size = 1366*768*4;   //1366 X 768 is the dimension of my image that i got from X11 and 4 is number of bits per pixel
    ifstream file ("imagedata", ios::in|ios::binary|ios::ate);
    data = new char[size];
    file.read (data, size);

    CImgDisplay *disp;
    CImg <float>img3(data,1366,768,1,4);
    disp = new CImgDisplay(1024,768,"window");
    disp->display(img3);
    getchar();
    return 0;   
}