微软windows Bitmap文件概述

本文详细介绍了Windows Bitmap File (BMP) 格式的概述、类型、色深、压缩方式、最大图像数据大小、支持的平台、应用程序及文件结构等关键信息。包括了无压缩和行程长度编码压缩方式的详细解释,以及不同色深的图像如何进行RLE编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:只对文章的其中部分进行了翻译,源文件:http://www.fileformat.info/format/bmp/egff.htm

概述

Windows Bitmap File也可以称为BMP,DIB,Windows BMP, Windows DIB,或兼容性BMP.

类型 Bitmap
色深,一个像素用多少位表示 1-, 4-, 8-, 16-, 24-, and 32-bits
压缩方式 RLE, 无压缩
最大图像数据大小 32Kx32K 或2Gx2G pixels
每个文件支持多张图片
数值格式 Little-endian
发起人 Microsoft Corporation
支持平台 Intel machines running Microsoft Windows, Windows NT, Windows 95, OS/2, and MS-DOS
支持的应用程序 太多了,不胜枚举
另请参阅 OS/2 Bitmap

文件结构

Windows 1.x 的DDB文件格式有两部分组成:文件头和Bitmap数据,没有调色板和其它特征信息。

文件头

Bitmap数据

Windows 2. x , 3. x , and 4. x  BMP 文件包含四部分:文件头信息头、调色板和Bitmap数据。这四部分只有调色板是可选的,根据色深的位数而定,其它三部分每个BMP文件都必不可少的。

文件头

信息头

调色板

Bitmap数据


图像数据和压缩

无压缩的图像数据是由一系列8位指向调色板的索引或真实的颜色值表示的。

Windows BMP文件格式对4位和8位色深的图片支持简单的行程长度编码RLE(run-length encoded),但对1、16、24、32bit色深的图片不能使用该压缩方式。

BMP采取两个值的RLE方案,第一个值是存放重复的次数,第二个值存放实际的值,重复次数不大于256;如果有大于256个完全相同的像素,则超过部分要用两个字节表示。这只是简单的描述,事实上更复杂,还有连续不重复的数据。RLE有两种编码方式,分别是RLE4和RLE8,分别对应4位和8位色深的图像,下面将详细讲解。

8位的RLE(RLE8)采取存储重复像素,第一个字节是0-255之间,表示重复的次数,第二个字节是一个真8位的实的颜色值,例如编码05 18将会解压成5个重复的像素值18即:18 18 18 18 18.对于RLE也类似,就是表示的位数不同。具体的压缩方式见如下表:

标识

00 00           一行的结尾
00 01           文件的结尾
00 02 XX YY     位置偏移标记,偏移YY行XX个像素
00 tt           后面的tt位量真实的像素值

RLE8

压缩编码

解码描述

解码

04 16

4个字节的 16

16 16 16 16

08 45

8个字节的 45

45 45 45 45 45 45 45 45

00 00

一行的结尾

00 02 04 02

向上偏移2行加4个像素

03 E4

3个字节的 E4

E4 E4 E4

00 03 12 A4 46 00

后面3位有效的未压缩像素数据

12 A4 46

00 00

一行的结尾

00 01

文件的结尾


RLE4


压缩编码

解码描述

解码

04 16

4个交替的 1 、6值

1 6 1 6

08 44

8个交替的 1 、8值

4 4 4 4 4 4 4 4

00 00

一行的结尾

00 02 04 02

向上偏移2行加4个像素值

03 E4

3个交替的 1 、6值

E 4 E

00 06 12 A4 46 00

后面6位有效的未压缩像素数据

1 2 A 4 4 6

00 00

一行的结尾

00 01

文件的结尾


以下是一些Windows BMP文件数据类型的概述:

像素色深    

一个像素的大小    

压缩方式    

调色板    

颜色透明度  

1 bit

1 bit

0

4 bits

4 bits

0 , 2

8 bits

1 byte

0 , 1

16 bits

4 bytes

3

24 bits

3 bytes

0

32 bits

4 bytes

3

注:压缩方式0表示不压缩,1表示RLE8,2表示RLE4


windows平台上支持BITMAPCOREHEADER、BITMAPINFOHEADER、BITMAPV4HEADER、BITMAPV5HEADER四种类型位图的类库! 简单用法举例: DibBitmap bmp,ret,tmp; bmp.Open(_T("E:\\bmp.bmp"));//打开 bmp.ConvertBit(4,ret);//转为4位位图,ret保存返回值 ret.RotateLeft(tmp);//向左旋转90度,tmp保存返回值 tmp.Invert();//所有像素反色,即RGB(1,2,3)变为RGB(254,253,252) tmp.At(10,10)=tmp.At(20,20);//单个像素点的取值和赋值操作 tmp.At(10,20)=ret.At(30,30);//注意,设置成的颜色如果颜色表内不存在,会设置成相近色 tmp.At(20,10)=RGB(255,0,0); bmp.AlphaBlend(0,0,tmp,128,RGB(255,255,255),true);//tmp以透明度128画到bmp的(0,0)处,其中tmp中的白色会镂空 bmp.Mirror();//bmp水平翻转 bmp.ConvertBit(16,ret,true);//转为5-6-5型16位位图,ret保存返回值 ret.SetClipbrd();//存入剪切板中 ret.Save(_T("E:\\bmp2.bmp"));//保存到文件 该类的头文件接口大致如下: class DibBitmap { BITMAPFILEHEADER* m_pbmfh; DWORD m_size;//保存m_pbmfh中malloc出来的内存大小,即是capacity//不为0时保证图像是可以处理的 public: enum BmType{NONE=0,CORETYPE,INFOTYPE,V4TYPE,V5TYPE}; public: class reference { //略.. }; public://DibBitmap01.cpp DibBitmap(); explicit DibBitmap(LPCTSTR pstrFileName); explicit DibBitmap(BITMAPFILEHEADER* pbmfh);//只是简单的赋值给成员变量m_pbmfh DibBitmap(HDC hdc, HBITMAP hBitmap, int BitCount);//1,4,8;16,24,32 DibBitmap(const DibBitmap& rhs); ~DibBitmap(); bool Open(LPCTSTR pstrFileName);//打开失败会Close() bool Save(LPCTSTR pstrFileName)const; void Close(); void Swap(DibBitmap& rhs); DibBitmap& operator=(const DibBitmap& rhs);//不一定申请过新内存 public://DibBitmap01.cpp BITMAPFILEHEADER* Get();//获取文件头 const BITMAPFILEHEADER* Get()const; BITMAPINFOHEADER* GetInfoHead();//获取信息头 const BITMAPINFOHEADER* GetInfoHead()const; RGBQUAD* GetQuad();//获取颜色表//没有颜色表,则返回NULL const RGBQUAD* GetQuad()const; BYTE* GetByte();//获取图素位 const BYTE* GetByte()const; bool GetMask(DWORD* dwMask,bool b565=false)const; //dwMask个数为四,需要屏蔽码时,依次存入RGB屏蔽码,并返回true //当为BITMAPV4HEADER以上时,还存入AlphaMask;b565参数同GetClr bool Attach(BITMAPFILEHEADER* pbmfh); BITMAPFILEHEADER* Detach();//返回值最后须free掉 HBITMAP CreateBitmap(HDC hdc)const;//返回值最后须DeleteObject掉 HBITMAP CreateDibSection ()const;//返回值最后须DeleteObject掉 BmType Type()const; DWORD Capacity()const;//返回m_size的值//注意,此值可能小于实际malloc的内存长度 DWORD FileSize()const;//整个文件的大小//不是返回m_size的值,m_size的值大于等于此返回值 DWORD BitsSize()const;//图素位的大小,即去掉文件头,信息头和颜色表之后的大小 DWORD Offset()const;//图素位的偏移量 LONG Width()const; LONG Height()const;//可能为负值 WORD Planes()const; WORD BitCount()const; DWORD ClrUsed()const; //一般是4,8位图才小于2^(4,8),其余的等于对应颜色数,m_pbmfh为空时返回0,32位图时,返回-1,16位555位图颜色数按565算 public://DibBitmap02.cpp LPTSTR DisplayDibHeader (LPTSTR szBuffer)const;//szBuffer得大于1200个//返回szBuffer RGBQUAD GetClr(size_t x,size_t y,bool b565=false)const; //获取(x,y)处的颜色值,已考虑方向问题,b565只有在16位深位图且没有屏蔽码时才有用,指明是5-5-5还是5-6-5 COLORREF GetRGBClr(size_t x,size_t y,bool b565=false)const;//条件同上//返回的最高位为0 bool GetClipbrd(HWND hwnd);//失败不一定会Close() void SetClipbrd(HWND hwnd)const; //If hwnd is NULL, the open clipboard is associated with the current task. void Mirror(bool bHoriz);//镜像//false表示垂直镜像 public://DibBitmap03.cpp void Invert(bool b565=false);//反色//在这里b565参数不起任何作用 RGBQUAD Invert(size_t x,size_t y,bool b565=false);//(x,y)处的颜色反色,返回反色后的近似颜色 RGBQUAD SetClr(size_t x,size_t y,RGBQUAD quad,bool b565=false);//设置颜色,返回设置成的最相近的颜色 COLORREF SetRGBClr(size_t x,size_t y,COLORREF clr,bool b565=false);//设置颜色,返回设置成的最相近的颜色 //以下两个函数相当牛逼,可直接引用修改颜色 COLORREF At(size_t x,size_t y,bool b565=false)const;//获取(x,y)处的颜色 reference At(size_t x,size_t y,bool b565=false);//获取(x,y)处的颜色引用,可直接进行修改 void AlphaBlend(int x,int y,const DibBitmap& rhs,BYTE bAlpha,COLORREF clr,bool bClr=false,bool b565=false); //把rhs以透明度bAlpha画到this中的(x,y)处(可以为负),注意:当&rhs==this时直接返回,啥也不操作 //若bClr为true,则clr参数有用,rhs中颜色值为clr的像素点完全透明 void RotateLeft(DibBitmap& ret)const; //this旋转(逆时针90度)后存入ret中,若this原先为空,则不改变ret,注意:当&ret==this时直接返回,啥也不操作 void RotateRight(DibBitmap& ret)const; //this旋转(顺时针90度)后存入ret中,若this原先为空,则不改变ret,注意:当&ret==this时直接返回,啥也不操作 void RotateOpposite();//旋转180度,注意后面没有const,此函数是旋转自身 public://DibBitmap04.cpp bool ConvertBit(WORD BitCount,DibBitmap& ret,bool b565=false)const; //转为同类型的不同位数位图//1,4,8;16,24,32,注意:当&ret==this时直接返回,啥也不操作 }; 说明: 此类支持四种位图格式: BITMAPCOREHEADER、BITMAPINFOHEADER、BITMAPV4HEADER、BITMAPV5HEADER。 该类像素点坐标序号从0开始,原点位于位图左上角,不管位图信息头的高度字段是否为负,内部都已作转化处理 暂不支持这四种位图的以下几种情况: 1、biCompression字段为BI_RLE4,BI_RLE8,BI_JPEG,BI_PNG的位图; 2、BITMAPV5HEADER时,bV5CSType字段等于PROFILE_LINKED或PROFILE_EMBEDDED时的位图。 有问题联系:hastings1986@163.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值