Использование данных пикселей, полученных с изображения с использованием DevIL - PullRequest
0 голосов
/ 06 февраля 2012

Я использую Visual Studio 2010, C ++.

То, что я пытаюсь сделать, это получить данные пикселей (в частности, цвета RGB) из загруженного изображения и затем использовать их в различных проверках. В настоящее время я хочу просмотреть все данные и определить, когда пиксель имеет определенный цвет (конкретные значения R, G и B).

Я должен отметить, что я использую DevIL, и я предпочел бы продолжать использовать DevIL (я видел кучу предложений относительно других инструментов, которые помогают с обработкой изображений).

Прямо сейчас, насколько я понимаю, функция DevIL ilgetData () извлекает указатель, который имеет все значения RGB всех пикселей в одномерном массиве байтов. Я не знаю, как сохранить данные, полученные с помощью этой функции, а затем использовать их в цикле for.

Пример кода очень ценится.

1 Ответ

5 голосов
/ 07 февраля 2012

Правильный способ хранения возврата 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 в данном пикселе для всех пикселей изображения.Как отметил Барт, приведенный ниже порядок относится к формату 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]);
   }
}
...