- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
bmp 位图和 OpenGL 的像素操作
OpenGL 入门学习 [十 ]今日我们先简单介绍 Windows 中
常用的 BMP 文件格式,而后讲 OpenGL 的像素操作。固然看起来内容可能有点多,但实质只有少许几个知识点,假如
读者对诸如“显示 BMP 图象”等内容比较感兴趣的话, 可能不知不觉就看完了。
像素操作能够很复杂,这里仅波及了简单的部分,让大家对 OpenGL 像素操作有初步的印象。
学过多媒体技术的朋友可能知道,计算机保留图象的方法通
常有两种: 一是“矢量图”,一是“像素图”。矢量图保留了图象中每一几何物体的地点、 形状、大小等信息, 在显示图象时,依据这些信息计算获取完好的图象。“像素图”是将完好的图象纵横分为若干的行、列,这些队列使得图象被切割为很细
小的分块,每一分块称为像素,保留每一像素的颜色也就保留了整个图象。
这两种方法各有优弊端。“矢量图”在图象进行放大、减小时很方便,不会失真,但假如图象很复杂,那么就需要用特别多的几何体,数据量和运算量都很宏大。“像素图”不论图象
多么复杂,数据量和运算量都不会增添,但在进行放大、减小等操作时,会产生失真的状况。
前方我们曾介绍了怎样使用 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 则不必定是
位的。
FILE* pFile;
在这里进行“翻开文件”的操作
fseek(pFile, 0x0012, SEEK_SET);
0x0012 地点
// 挪动到
fread(amp;width, sizeof(width), 1, pFile); // 读取宽度
fseek(pFile, 0x0016, SEEK_SET); // 挪动到
0x0016 地点
// 因为上一
句履行后本就应当在 0x0016 地点
// 所以这一
句可省略
fread(amp;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;
L
原创力文档


文档评论(0)