你如何读取位图作为GLubyte数组?

时间:2011-11-22 13:19:54

标签: c++ opengl bitmap

我知道已经有a question这个,但它没有提供代码解决方案。

我正在尝试使用此函数将位图图像加载到GL应用程序中:

void glBitmap(GLsizei  width,
              GLsizei  height,
              GLfloat  xorig,
              GLfloat  yorig,
              GLfloat  xmove,
              GLfloat  ymove,
              const GLubyte *  bitmap);

有人可以给我一个返回GLubyte*给定文件名的函数吗?我一直在网上寻找一个可行的算法,但似乎无法工作。

2 个答案:

答案 0 :(得分:1)

使用glBitmap显示图像的问题是您需要从文件加载图像,然后将数据解释为颜色索引数组。由于每个可能的库和示例都将图像数据解释为RGB(或RGBA),并且由于需要使用glColorTable设置颜色表,因此没有人使用glBitmap来加载图像,因此没有关于如何将glBitmap与数据一起使用的实际示例从文件中加载。

顺便说一句,这是来自glBitmap reference page

  

位图图像被解释为glDrawPixels的图像数据   命令,宽度和高度对应于宽度和高度   该命令的参数,类型设置为GL_BITMAP和格式   设置为GL_COLOR_INDEX。

省去麻烦,并使用glDrawPixels或纹理显示文件中的图像。

This page包含如何使用glBitmap显示图像但不包含文件的示例。

答案 1 :(得分:0)

首先,您需要了解glBitmap的作用:glBitmap绘图函数。它查看给定数据的每个位(因此映射),解释为2维数组并相对于当前栅格位置(使用glRasterPos设置)将这些像素设置为当前设置位图中相应位的栅格颜色(glRasterColor)。每个GLubyte包含8位,因此每个字节覆盖8个像素宽度(使用glPixelStore设置endianess)。

用于从文件中读取位图。 AFAIK只有一种广泛的位图格式(与具有通道的像素图形成对比,其中每个像素的通道可以采用一系列值)。该格式为PBM:http://en.wikipedia.org/wiki/Netpbm_format

根据维基百科页面提供的信息,可以直接编写一个函数,打开并读取PBM文件(所需函数为fopenfreadfclose)到结构中数据。然后,可以使用该结构将数据提供给glBitmap

但请记住,位图只是二值图像,即黑白,没有灰色,更不用说颜色了。

现在你的想法是“加载位图”。我已经告诉过,glBitmap会立即绘制您提供的数据。所以我认为你真正想要的是 textures 和一个纹理加载器的图像文件。