c++devil

DevIL/OpenIL isn't loading alpha channel


I am having an issue where the .png image that I want to load as a byte array using DevIL is not having an alpha channel.

A complete black image is also appearing as having alpha channel values as 0.

This is my image loading function:

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;

The Image object I am using is as follows:

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();
};

And this is how I am printing out the image data for now:

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]);
}

I also tried using the ilTexImage() to format the loaded image to RGBA format but that also doesn't seem to work. The printing loop starts reading garbage values when I change the maximum value of the loop variable to 4 times the number of pixels in the image.

The image is also confirmed to have an alpha channel. What might be going wrong here?

EDIT: ilGetInteger(IL_IMAGE_BPP) is returning 3, which should mean RGB for now. When I use the ilTexImage() to force 4 channels, then ilGetInteger(IL_IMAGE_BPP) returns 4 but I still see garbage values popping up at the std output


Solution

  • The problem was fixed by a simple ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE) call after loading the image.

    I suppose DevIL loads the image in RGB mode with unsigned byte values by default and to use otherwise, you need to convert the loaded image using ilConvertImage().