DevIL/OpenIL не загружает альфа-канал

У меня возникла проблема, когда .png Изображение, которое я хочу загрузить в виде байтового массива с использованием DevIL, не имеет альфа-канала.

Полное черное изображение также имеет значения альфа-канала, равные 0.

Это моя функция загрузки изображений:

DevILCall(ilGenImages(1, &m_ImageID));
DevILCall(ilBindImage(m_ImageID));

ASSERT("Loading image: " + path);

DevILCall(ilLoadImage(path.c_str()));

GraphicComponents::Image image(
    ilGetData(),
    ilGetInteger(IL_IMAGE_HEIGHT),
    ilGetInteger(IL_IMAGE_WIDTH),
    ilGetInteger(IL_IMAGE_BITS_PER_PIXEL)
);

return image;

Image Объект, который я использую, выглядит следующим образом:

struct Image
{
    ILubyte * m_Image;
    const unsigned int m_Height;
    const unsigned int m_Width;
    const unsigned int m_BPP;

    Image(ILubyte imageData[ ], unsigned int height, unsigned int width, unsigned int bpp);
    ~Image();
};

И вот как я сейчас распечатываю данные изображения:

for(unsigned int i = 0; i < image->m_Height*image->m_Width*4; i+=4)
{
    LOG("Red:");
    LOG((int) image->m_Image[i]);
    LOG("Green:");
    LOG((int) image->m_Image[i+1]);
    LOG("Blue:");
    LOG((int) image->m_Image[i+2]);
    LOG("Alpha:");
    LOG((int) image->m_Image[i+3]);
}

Я также пытался использовать ilTexImage() отформатировать загруженное изображение в RGBA формат, но это также не похоже на работу. Цикл печати начинает считывать значения мусора, когда я изменяю максимальное значение переменной цикла в 4 раза больше количества пикселей в изображении.

Также подтверждено, что изображение имеет альфа-канал. Что может быть не так?

РЕДАКТИРОВАТЬ: ilGetInteger(IL_IMAGE_BPP) возвращает 3, что должно означать RGB на данный момент. Когда я использую ilTexImage() заставить 4 канала, то ilGetInteger(IL_IMAGE_BPP) возвращает 4, но я все еще вижу значения мусора, появляющиеся на выходе std

1 ответ

Решение

Проблема была исправлена ​​простым ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE) позвоните после загрузки изображения.

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

Другие вопросы по тегам