用于颜色类型3的PNG图像纹理格式

时间:2013-01-17 06:07:28

标签: c++ opengl png textures libpng

我有一个128x128尺寸的PNG图像。当我用libpng读取它的IHDR块时,它显示图像有颜色类型3.问题是我无法找到任何应​​该是这种颜色类型的纹理格式。我想用OpenGL绘制这个图像。但如果没有正确的纹理格式,图像颜色就不应该是它。如果可以提供任何参考,我可以阅读有关此事的详细信息将不胜感激。

我使用此方法为其他颜色类型设置纹理格式

inline void GetPNGtextureInfo (int color_type,GLuint *format)
{

switch (color_type)
{
    case PNG_COLOR_TYPE_GRAY:
        *format = GL_LUMINANCE;
        break;

    case PNG_COLOR_TYPE_GRAY_ALPHA:
        *format = GL_LUMINANCE_ALPHA;
        break;

    case PNG_COLOR_TYPE_RGB:
        *format = GL_RGB;
        break;

    case PNG_COLOR_TYPE_RGB_ALPHA:
        *format = GL_RGBA;
        break;

    default:
        break;
  }
}

1 个答案:

答案 0 :(得分:1)

调色板只是一个颜色数组,图像数据只是该数组的索引。

因此,如果您想将图像转换为RGB图像,请为该图像中的图像分配足够大的新缓冲区,并通过从源图像中获取像素的索引来填充它,使用该值索引调色板,并将您获得的RGB值存储到目标图像中。

您可能会发现GL的一种风格支持调色板纹理,并且可以直接加载它们,但是现在硬件支持不太常见,而您所做的一切就是将工作卸载到驱动程序,这将是将纹理转换为24位。

例如,OpenGL ES通过glCompressedTexImage2D()函数支持某些类型的palettised纹理,但完全有可能这只会给实现带来负担,将这些纹理转换为硬件可以处理的东西。

除非您有存储空间问题,否则我会支持离线转换(例如,首先将图像保存为24位),但无论从哪方面来说都不是很困难。