【问题标题】:Using the pixel data retrieved from an image using DevIL使用 DevIL 从图像中检索的像素数据
【发布时间】:2012-02-28 06:48:57
【问题描述】:

我正在使用 Visual Studio 2010,C++。

我要做的是从加载的图像中检索像素数据(特别是 RGB 颜色),然后在各种检查中使用它。目前,我想遍历所有数据并能够检测像素何时是某种颜色(特定的 R、G 和 B 值)。

我应该注意到我正在使用 DevIL,并且我更愿意继续使用 DevIL(我已经看到了很多关于使用其他有助于图像处理的工具的建议)。

现在,据我了解,DevIL 函数 ilgetData() 检索一个指针,该指针具有一维字节数组中所有像素的所有 RGB 值。我不知道如何存储使用此函数获取的数据,然后在 for 循环中使用它。

非常感谢示例代码。

【问题讨论】:

    标签: c++ image pixels devil


    【解决方案1】:

    将 ilGetData() 的返回值存储在 IL 无符号字节数组中的正确方法。

    例如

    ILubyte * bytes = ilGetData();
    

    要在你使用的 for 循环中迭代它

      for(int i = 0; i < size; i++)
      {
        // Print out each ILubyte one at time
        printf("%d\n", bytes[ i ]);
      }
    

    您可能想要的是一个 for 循环,它为图像中的所有像素在给定像素的 RGB 值处打印或执行其他操作。正如 Bart 指出的,下面的排序是针对 IL_RGBA 或 RGBA 格式的。如果使用 IL_RGB 则 4 变为 3,如果使用 IL_BGR 或 IL_BGRA 则需要按预期切换红色和蓝色值。

    ILuint width,height;
    width = ilGetInteger(IL_IMAGE_WIDTH);
    height = ilGetInteger(IL_IMAGE_HEIGHT);
    
    for (int i = 0; i < height; i++)
    {
       for (int j = 0; j < width; j++)
       {
          printf( "%s\n", "Red Value for Pixel");
          printf( "%d\n", bytes[(i*width + j)*4 + 0]); 
          printf( "%s\n", "Green Value for Pixel");
          printf( "%d\n", bytes[(i*width + j)*4 + 1]);
          printf( "%s\n", "Blue Value for Pixel");
          printf( "%d\n", bytes[(i*width + j)*4 + 2]);
       }
    }
    

    【讨论】:

    • 非常感谢您。你几乎解决了一个星期寻找我的问题。代码示例非常感谢。再次感谢。
    猜你喜欢
    • 2015-05-17
    • 2013-01-23
    • 1970-01-01
    • 2011-02-20
    • 2012-10-05
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多