CImg对二进制图像数据

时间:2014-04-22 18:50:02

标签: c++ image cimg

我使用X11 xGetImage创建了一个二进制文件,并在binary file中存储了数据字段的内容(该文件已压缩。请解压缩)。现在,我正在玩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);

现在,我可以看到窗口中的图像,但质量下降了。所以我试着看看代码,发现

第34318行

assign(dimw,dimh,1,4); // the depth is assigned to 1. which i believe is the culprit, however i would like confirm it

以及为什么它仅在为模板传递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;   
}

在相同的imagedata上运行此代码(如第一种情况),我得到的只是一个黑色窗口。此外,设置第4个参数(即深度(z))会导致分段错误

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

  

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

CImg数据格式:http://cimg.eu/reference/group__cimg__storage.html

如果要手动从缓冲区初始化CImg对象,则应自行设置此数组。

这是jpeg图片的示例,对于其他格式,您可以检查来源(函数名称: _load_png _load_jpeg 等):

https://github.com/EyalAr/lwip/blob/master/src/decoder/jpeg_decoder.cpp