位图文件读写综述

关于位图文件操作的资料很多。为了方便开发人员的工作,写下本文,介绍了位图文件结构,在此基础之上设计了通用类CFG_DIB,用于进行位图文件的读写操作。

一、位图文件结构

位图文件由三部分组成:文件头 + 位图信息 + 位图像素数据

1、位图文件头。位图文件头主要用于识别位图文件。以下是位图文件头结构的定义:

typedef struct tagBITMAPFILEHEADER { // bmfh
  WORD  bfType;
  DWORD  bfSize;
  WORD  bfReserved1;
  WORD  bfReserved2;
  DWORD  bfOffBits;
} BITMAPFILEHEADER;

其中的bfType值应该是“BM”(0x4d42),标志该文件是位图文件。bfSize的值是位图文件的大小。

2、位图信息中所记录的值用于分配内存,设置调色板信息,读取像素值等。

以下是位图信息结构的定义:typedef struct tagBITMAPINFO {
  BITMAPINFOHEADER  bmiHeader;
  RGBQUAD       bmiColors[1];
} BITMAPINFO;

可见位图信息也是由两部分组成的:位图信息头 + 颜色表

2.1位图信息头。位图信息头包含了单个像素所用字节数以及描述颜色的格式,此外还包括位图的宽度、高度、目标设备的位平面数、图像的压缩格式。以下是位图信息头结构的定义:typedef struct tagBITMAPINFOHEADER{ // bmih
  DWORD biSize;
  LONG  biWidth;
  LONG  biHeight;
  WORD  biPlanes;
  WORD  biBitCount
  DWORD biCompression;
  DWORD biSizeImage;
  LONG  biXPelsPerMeter;
  LONG  biYPelsPerMeter;
  DWORD biClrUsed;
  DWORD biClrImportant;
} BITMAPINFOHEADER;

下表是对结构体当中各个成员的说明:

结构成员 说 明
biSize 结构BITMAPINFOHEADER的字节数,即sizeof(BITMAPINFOHEADER)*
biWidth 以像素为单位的图像宽度*
biHeight 以像素为单位的图像长度*
biplanes 目标设备的位平面数
biBitCount 每个像素的位数*(1)
biCompression 图像的压缩格式(这个值几乎总是为0)
biSizeImage 以字节为单位的图像数据的大小(对BI_RGB压缩方式而言)
biXPelsPermeter 水平方向上的每米的像素个数
biYpelsPerMeter 垂直方向上的每米的像素个数
biClrused 调色板中实际使用的颜色数(2)
biClrImportant 现实位图时必须的颜色数(3)

说明:*是需要加以注意的部分,因为它们是我们在进行位图操作时经常参考的变量

时间: 2024-08-20 05:22:30

位图文件读写综述的相关文章

转 从内核文件系统看文件读写过程

系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境,但是计算机系统的各种硬件资源是有限的,因此为了保证每一个进程都能安全的执行.处理器设有两种模式:"用户模式"与"内核模式".一些容易发生安全问题的操作都被限制在只有内核模式下才可以执行,例如I/O操作,修改基址寄存器内容等.而连接用户模式和内核模式的接口称之为系统调用. 应用程序代码运行在用户模式下,当应用程序需要实现内核模式下的指令时,先向操作系统发送调用请求.操作系统收到请求后,执行

Lua文件读写详解

  这篇文章主要介绍了Lua文件读写详解,本文讲解了文件读写的简单模型和完整模型,并给出了一个操作示例,需要的朋友可以参考下 lua里的文件读写模型来自C语言,分为完整模型(和C一样).简单模型. 1.简单模型 io.input([file]) 设置默认的输入文件,file为文件名(此时会以文本读入)或文件句柄(可以理解为把柄,有了把柄就可以找到文件),返回文件句柄. io.output([file]) 设置默认的输出文件,参数意义同上. io.close([file]) 关闭文件,不带参数关闭

为什么不能再构造函数中执行大量的内存分配、文件读写等复杂操作??

问题描述 为什么不能再构造函数中执行大量的内存分配.文件读写等复杂操作?? 大婶们啊:为什么不能再构造函数中执行大量的内存分配.文件读写等复杂操作??? 解决方案 可以啊!谁告诉你不行的? 只是在构造函数做太复杂的操作,当出错时发现错误有时会很困难.特别是定义为全局变量时,程序还没有运行.就出错了. 解决方案二: 构造函数主要进行一些初始化工作,复杂的工作放到成员函数中处理,这样比较符合OOP设计 解决方案三: 以牺牲对象分配的时间来换取代码的简单行· 是可以的·! 但是不推荐 解决方案四: 这

c语言-C语言 文件读写fscanf 不能读取文件第一行

问题描述 C语言 文件读写fscanf 不能读取文件第一行 我在做USACO的训练题 按照要求写了个读文件的程序,但是出了一点我不能理解的bug 希望老师指点指点 程序: int main () { char comet[6]; char group[6]; FILE *input; input=fopen ("ride.in", "r"); fscanf (input, "%sn%s", comet, group ); \fscanf (inp

linux文件读写浅析

在<linux内核虚拟文件系统浅析>这篇文章中,我们看到文件是如何被打开.文件的读写是如何被触发的. 对一个已打开的文件fd进行read/write系统调用时,内核中该文件所对应的file结构的f_op->read/f_op->write被调用. 本文将顺着这条路走下去,大致看看普通磁盘文件的读写是怎样实现的. linux内核响应一个块设备文件读写的层次结构如图(摘自ULK3): 1.VFS,虚拟文件系统. 之前我们已经看到f_op->read/f_op->write如

用 Java 保存位图文件(转)

用 Java 保存位图文件教程 -- 其中包括将图像对象写入位图文件的全部代码 作者 Jean-Pierre Dubé 摘要虽然 Java 提供了几种打开图像的机制,但保存图像并不是它的强项.这篇技巧将讲述如何将图像保存在 24 位位图文件中.另外,Jean-Pierre 还提供了将图像文件写入位图文件所需的全部代码. 这篇技巧是 Java 技巧 43 的补充,那篇技巧说明了在 Java 应用程序中加载位图文件的过程.本月我再提供一篇教程,说明如何将图像保存在 24 位位图文件中,其中还包含将图

用 Java 保存位图文件

用 Java 保存位图文件5/23/2001 9:28:10· Jean-Pierre Dubé·jdeveloper -------------------------------------------------------------------------------- 1 2  下一页 摘要 虽然 Java 提供了几种打开图像的机制,但保存图像并不是它的强项.这篇技巧将讲述如何将图像保存在 24 位位图文件中.另外,Jean-Pierre 还提供了将图像文件写入位图文件所需的全部代码

PHP文件读写操作之文件写入教程

在PHP网站开发中,存储数据通常有两种方式,一种以文本文件方式存储,比如txt文件,一种是以数据库方式存储,比如Mysql,相对于数据库存储,文件存储并没有什么优势,但是文件读写操作在基本的PHP开发中还是时有使用,今天和大家分享如何利用PHP技术实现文件读写之文件写入操作教程,也算是对PHP文件读写操作的入门学习. 将数据写入文件的操作主要涉及三个步骤及部分文件操作函数如下: 1.打开文件(文件操作函数:fopen) 2.写入文件(文件操作函数:fwrite等) 3.关闭文件(文件操作函数:f

Python 3.2官方文档翻译之文件读写

5.2文件读写 Open()方法返回一个文件对象,在大多数情况下传递两个对象: open(filename, mode): 例如: >>> f = open('/tmp/workfile', 'w') 第一个参数是包含文件名称的字符串,第二个参数是包含描述文件使用方式的字符串.如果文件只读标记为"r",只写标记为"w"(相同名字的已经存在文件将会被清除),, "a"表示添加到文件结尾,数据就会自动的添加到文件的结尾."