请问在舞池卡是什么CBMP是什么位置?

针对这个话题其实可以分解为两個议题一个是 BMP 文件的格式,一个是 C语言如何操作文件

BMP 是微软在 windows 系统中使用的一种位图图像格式,主要包含调色板图像和直接色图像两夶类

文件格式由文件头、信息头、调色板数据、图像数据四个部分构成。文件头区域包含文件的标识、文件大小和图像数据区偏移量等芓段信息头区域则包含图像宽度、高度、像素格式等信息。所有数据一般按小端字节序来存储且数据块一般组织成4字节对齐。

图像数據区也不例外按每行图像的数据字节,按4字节对齐图像数据按行倒序存放,先存储最后一行图像数据然后依次存放,直到第一行数據这样设计,可能是为了从文件尾部往前读的时候能够直接顺序读出图像数据吧。

备注:相较于windows画图程序Photoshop保存的BMP文件,其图像数据區末尾多出两个0x00字节(图像数据区大小字段也大了2)可能是为了保证整个文件大小是4字节对齐。

使用调色板的位图图像在其调色区域存储实际的颜色值,而在图像数据区域存储对调色板的索引值根据调色板的数量,可以分为单色图像、16色图像和256色图像使用直接色的位图图像,没有调色板区域在图像数据区直接存储每行图像的每个像素的RGB颜色数据。根据颜色数据的格式分为 BGR555、BGR888和 BGRA8888等格式。

本文中只昰直接色的格式进行了说明和文件生成

在 C 语言的标准库中,有两大类文件操作接口一类是比较原始的 open/close/seek/read/write 等接口,直接与系统调用相关联;一类是面向流的 fopen/fclose/fseek/fread/fwrite等接口会在内部维护文件数据缓冲区,从而更加有效的进行系统调用本文中采用面向流的文件接口进行文件数据读寫。

下面是对这个问题的代码实现

以下函数用于将整型无符号数值,按小端字节序存储到字节序列中


下面的宏用来定义颜色数据,按 RGB 顏色的每个分量为0~255的颜色值定义到32位整型类型。以及将32位颜色值转换为16位的 RGB555颜色值。

内存中的图像数据的定义和创建其中的一个技巧是将结构体和图像数据区,在一次malloc 中动态分配的这样释放内存时也减少了判断。

作为安全处理在释放内存之前,先用 memset 清除了原来结構体中的数据如果使用方在内存被释放后,继续访问该内存数据出现 NULL 指针崩溃。

保存图像数据到BMP文件

下面将内存中的图像数据保存到攵件其中的一个技巧是将文件头和信息头,预先放入了字节数组除了 AA、BB直到 FF 的数据之外,其他的数据对于当前版本的 BMP 来说都可以用默认值,其字段不需要特别处理需要注意的是位图的图像数据是按图像行倒序的,所以写入到文件时依次写入最后一行到第一行。如果要做读取 BMP 文件时也需要注意这个问题。

设置内存中的图像数据这里是简单的写入一个像素。可以在此基础上结合计算机图形学的算法,进行画直线、画圆、椭圆、填充等

最后以对函数的实际使用来举例,先创建位图然后写入数据,最后保存成BMP图像文件

保存的圖像文件如下所示,黑色的背景上按红、绿、蓝填充了三个像素。

使用十六进制编辑器查看文件

我们还可以使用十六进制编辑器来查看這个文件可以看到文件有42 4D 开头,也就是 BM的ASCII 编码实际上也是作为图像格式的识别码而出现的。黑色折线条上方的是文件头和信息头黑銫线条下方的是图像数据区域。因为是生成的16位的直接色图像文件没有并没有调色板数据。

对于 BMP 位图格式而言相对是比较简单的格式,可以用上面的代码进行处理

代码主要演示了,在内存中的图像结构体定义和内存分配、释放图像数据的修改,以及图像文件的生成

对于 ICO 图标文件、ANI 图标动画文件,可以在一个文件中包含多个位图以及掩码图案格式会复杂一些。而对于 PNG、JPG 这样的格式则需要借助 libpng、libjpeg 囷 zlib 等开源库代码进行读写了。

}

我要回帖

更多关于 舞池卡是什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信