C++ 基于二值图像数据的CImg
在使用X11 xGetImage拍摄快照后,我创建了一个二进制文件,并将数据字段的内容存储在了中(该文件已压缩。请解压缩)。现在,我正在玩一玩CImg,学习它的用法 第一个问题 所以,我使用load_rgba函数在这个二进制数据上尝试了CImgC++ 基于二值图像数据的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
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;
}