【问题标题】:CImg Reading ImageCImg 阅读图像
【发布时间】:2020-05-19 18:34:21
【问题描述】:

我正在从事一个大学项目,该项目旨在制作像 Bejewled 这样的游戏。我们正在使用 OpenGL 和 CImg。项目文件中包含以下功能:

    void ReadImage(string imgname, vector<unsigned char> &imgArray)
{
    using namespace cimg_library;
    CImg<unsigned char> img(imgname.c_str());
    imgArray.resize(img.height() * img.width() * 3, 0);
    int k = 0;
    unsigned char *rp = img.data();
    unsigned char *gp = img.data() + img.height() * img.width();
    unsigned char *bp = gp + img.height() * img.width();

    for (int j = 0; j < img.width(); ++j)
    {
        int t = j;
        for (int i = 0; i < img.height(); ++i, t += img.width())
        {
            imgArray[k++] = rp[t];
            imgArray[k++] = gp[t];
            imgArray[k++] = bp[t];
        }
        //imgArray[i][j] = img[k++];
    }
}

据我了解,顾名思义,这个函数应该读取一个图像。但我不知道如何使用它以及如何读取图像。如果有人可以指导我,我将不胜感激。

编辑: 这就是我调用函数的方式:

vector<unsigned char> imgvec;
ReadImage("donut", imgvec);

导致错误:

[CImg] *** CImgIOException *** [instance(0,0,0,0,00000000,non-shared)] CImg<unsigned char>::load(): Failed to open file 'donut'.

【问题讨论】:

  • 我的回答解决了您的问题吗?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步为您提供帮助。谢谢。 meta.stackexchange.com/questions/5234/…

标签: c++ opengl c++14 cimg


【解决方案1】:

您向它传递一个包含图像文件名的字符串和对用于保存像素的向量的引用。它会打开图像,调整矢量大小以适应每个像素 3 个字节的 RGB,并按顺序用像素填充矢量:

RGBRGBRGBRGBRGB

真的是这样。基本上,CImg 以平面方式保存像素……所有红色像素,然后是所有绿色像素,然后是所有蓝色像素。这会将它们重新排序为 RGB 三元组 - 大概是因为这就是 OpenGL 需要它们的方式。

【讨论】:

  • 所以该函数现在运行但我遇到了错误:[CImg] *** CImgIOException *** [instance(0,0,0,0,00000000,non-shared)] CImg::load(): 无法打开文件“甜甜圈”。它不加载 .png 或 .jpeg
  • 请在您原来的问题下点击edit,并显示您如何调用该函数。
  • 您的图片文件名必须是std::string,并且还应该有扩展名。
  • 我尝试提供扩展名 (.png),但出现同样的错误
  • 您是否使用了一个 IDE,它会在大量子目录中创建无穷无尽的 DEBUG/RELEASE 版本的代码,以便您的代码实际上在远离图像所在的 3 个目录中运行?尝试使用图像文件的完整绝对路径。或者添加一行输出程序的当前工作目录,这样你就可以看到你的图像是否在哪里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 2016-05-03
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多