我遇到一个问题,我要使用DevIL作为字节数组加载的.png
图像没有Alpha通道。
一个完整的黑色图像也显示为alpha通道值为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倍时,打印循环开始读取垃圾值。
还确认图像具有Alpha通道。 这里可能出什么问题了?
编辑:ilGetInteger(IL_IMAGE_BPP)
返回3,目前应该表示RGB。当我使用ilTexImage()
强制执行4个通道时,ilGetInteger(IL_IMAGE_BPP)
返回4,但我仍然看到std输出上弹出垃圾值
答案 0 :(得分:1)
加载图像后,通过简单的ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE)
调用解决了该问题。
我假设DevIL默认在RGB
模式下以无符号字节值加载图像,否则,您需要使用ilConvertImage()
转换加载的图像。