- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
OpenGL入门学习之十——BMP文件与像素操作
OpenGL 入门学习之十——BMP 文件与像素操作
2009-01-07 12:03
学过多媒体技术的朋友可能知道,计算机保存图象的方法通常有两种:一是“矢量图”,一
是“像素图”。矢量图保存了图象中每一几何物体的位置、形状、大小等信息,在显示图象
时,根据这些信息计算得到完整的图象。“像素图”是将完整的图象纵横分为若干的行、列,
这些行列使得图象被分割为很细小的分块,每一分块称为像素,保存每一像素的颜色也就保
存了整个图象。
这两种方法各有优缺点。“矢量图”在图象进行放大、缩小时很方便,不会失真,但如果图
象很复杂,那么就需要用非常多的几何体,数据量和运算量都很庞大。“像素图”无论图象
多么复杂,数据量和运算量都不会增加,但在进行放大、缩小等操作时,会产生失真的情况。
前面我们曾介绍了如何使用 OpenGL 来绘制几何体,我们通过重复的绘制许多几何体,可以
绘制出一幅矢量图。那么,应该如何绘制像素图呢?这就是我们今天要学习的内容了。
1、BMP 文件格式简单介绍
BMP 文件是一种像素文件,它保存了一幅图象中所有的像素。这种文件格式可以保存单色
位图、16 色或 256 色索引模式像素图、24 位真彩色图象,每种模式种单一像素的大小分别
为 1/8 字节,1/2 字节,1 字节和 3 字节。目前最常见的是 256 色 BMP 和 24 位色 BMP。这种
文件格式还定义了像素保存的几种方法,包括不压缩、RLE 压缩等。常见的 BMP 文件大多
是不压缩的。
这里为了简单起见,我们仅讨论 24 位色、不使用压缩的 BMP。(如果你使用 Windows 自带
的画图程序,很容易绘制出一个符合以上要求的 BMP)
Windows 所使用的 BMP 文件,在开始处有一个文件头,大小为 54 字节。保存了包括文件格
式标识、颜色数、图象大小、压缩方式等信息,因为我们仅讨论 24 位色不压缩的 BMP,所
以文件头中的信息基本不需要注意,只有“大小”这一项对我们比较有用。图象的宽度和高
度都是一个 32 位整数,在文件中的地址分别为 0x0012 和 0x0016,于是我们可以使用以下代
码来读取图象的大小信息:
GLint width, height; // 使用 OpenGL 的 GLint 类型,它是 32 位的。
// 而 C 语言本身的 int 则不一定是 32 位的。
FILE* pFile;
// 在这里进行“打开文件”的操作
fseek(pFile, 0x0012, SEEK_SET); // 移动到 0x0012 位置
fread(width, sizeof(width), 1, pFile); // 读取宽度
fseek(pFile, 0x0016, SEEK_SET); // 移动到 0x0016 位置
// 由于上一句执行后本就应该在 0x0016 位置
// 所以这一句可省略
fread(height, sizeof(height), 1, pFile); // 读取高度
54 个字节以后,如果是 16 色或 256 色 BMP,则还有一个颜色表,但 24 位色 BMP 没有这个,
我们这里不考虑。接下来就是实际的像素数据了。24 位色的 BMP 文件中,每三个字节表示
一个像素的颜色。
注意,OpenGL 通常使用 RGB 来表示颜色,但 BMP 文件则采用 BGR,就是说,顺序被反过
来了。
另外需要注意的地方是:像素的数据量并不一定完全等于图象的高度乘以宽度乘以每一像素
的字节数,而是可能略大于这个值。原因是 BMP 文件采用了一种“对齐”的机制,每一行
像素数据的长度若不是 4 的倍数,则填充一些数据使它是 4 的倍数。这样一来,一个 17*15
的 24 位 BMP 大小就应该是 834 字节(每行 17 个像素,有 51 字节,补充为 52 字节,乘以
15 得到像素数据总长度 780,再加上文件开始的 54 字节,得到 834 字节)。分配内存时,
一定要小心,不能直接使用“图象的高度乘以宽度乘以每一像素的字节数”来计算分配空间
的长度,否则有可能导致分配的内存空间长度不足,造成越界访问,带来各种严重后果。
一个很简单的计算数据长度的方法如下:
int LineLength, TotalLength;
LineLength = ImageWidth * BytesPerPixel; // 每行数据长度大致为图象宽度乘以
您可能关注的文档
- Medium chain triglycerides activate distal but not proximal gut.pdf
- Megawin 8051 OCD ICE使用说明书(中文版).pdf
- MELCOR_185_UsersGuide.pdf
- MentorKG破解步骤.doc
- Memory of the vernalized state in plants including the model grass Brachypodium distachyon.pdf
- Measurement of the Pseudoscalar Decay Constant fDs Using Charm-Tagged Events in e+e- Collis.pdf
- MEPC 65 INF21 fw for decrease in ship China fw 中国提案.pdf
- Measurement of the Strong Phase in D0 - K+pi- Using Quantum Correlations.pdf
- MES White Paper 1.pdf
- Metabolic Defense Responses of Seeded Bermudagrass during Acclimation to.pdf
文档评论(0)