自制bmp文件

这篇博客介绍了如何使用C++创建BMP文件。内容包括理解BMP文件头结构,如BITMAPFILEHEADER和BITMAPINFOHEADER,并展示了一段简洁的代码,用于将像素数据保存到BMP文件中,特别强调了像素排列方式和行长度必须为4的倍数。
摘要由CSDN通过智能技术生成
 
BMP文件前面是一个文件头(一般是54字节),后面跟着图像像素

 

 

偏移量

域的名称

大小

内容

 

 

 

图象文件 头

0000h

文件标识

2 bytes

两字节的内容用来识别位图的类型:

BM' Windows 3.1x, 95, NT, ...

BA' OS/2 Bitmap Array

CI' OS/2 Color Icon

CP' OS/2 Color Pointer

IC' OS/2 Icon

PT' OS/2 Pointer

注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识"BM"就行。

 

0002h

File Size

1 dword

用字节表示的整个文件的大小

 

0006h

Reserved

1 dword

保留,必须设置为0

 

000Ah

Bitmap Data Offset

1 dword

从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量

 

000Eh

Bitmap Header Size

1 dword

位图信息头(Bitmap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:

28h - Windows 3.1x, 95, NT, ...

0Ch - OS/2 1.x

F0h - OS/2 2.x

注:在Windows95982000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出 了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的 兼容性。

 

0012h

Width

1 dword

位图的宽度,以象素为单位

 

0016h

Height

1 dword

位图的高度,以象素为单位

 

001Ah

Planes

1 word

位图的位面数(注:该值将总是1


图象 信息 头

 

 

001Ch

Bits Per Pixel

1 word

每个象素的位数

1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)

4 - 16 色位图

8 - 256 色位图

16 - 16bit 高彩色位图

24 - 24bit 真彩色位图

32 - 32bit 增强型真彩色位图

 

001Eh

Compression

1 dword

压缩说明:

0 - 不压缩 (使用BI_RGB表示)

1 - RLE 8-使用8RLE压缩方式(BI_RLE8表示)

2 - RLE 4-使用4RLE压缩方式(BI_RLE4表示)

3 - Bitfields-位域存放方式(BI_BITFIELDS表示)

 

0022h

Bitmap Data Size

1 dword

用字节数表示的位图数据的大小。该数必须是4的倍数

 

0026h

HResolution

1 dword

用象素/米表示的水平分辨率

 

002Ah

VResolution

1 dword

用象素/米表示的垂直分辨率

 

002Eh

Colors

1 dword

位图使用的颜色数。如8-比特/象素表示为100h或者 256.

 

0032h

Important Colors

1 dword

指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要

调色板数据

根据BMP版本的不同而不同

Palette

N * 4 byte

调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:

  Blue      1字节用于蓝色分量

Green      1字节用于绿色分量

Red        1字节用于红色分量

Reserved  1字节用于填充符(设置为0)

图象数据

根据BMP版本及调色板尺寸的不同而不同

Bitmap Data

xxx bytes

该域的大小取决于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。

 

像素的每一行也必须是4的倍数

像素的排列是从最低行开始,从左到右,一直到第一行

24位时,每一像素以BGR来组织,每一像素用8位表示

 

VC中也定义了bmp文件头和信息相关的结构,下面为实现的简洁代码,也可自己定义每一位,以二进制的方式写入文件。

 

typedef struct tagBITMAPINFOHEADER{
        DWORD      biSize;
        LONG       biWidth;
        LONG       biHeight;
        WORD       biPlanes;
        WORD       biBitCount;
        DWORD      biCompression;
        DWORD      biSizeImage;
        LONG       biXPelsPerMeter;
        LONG       biYPelsPerMeter;
        DWORD      biClrUsed;
        DWORD      biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;
        DWORD   bfSize;
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

void SaveImageToBmp(long* pImage, char *filename)
{
 BITMAPFILEHEADER bfh;
 BITMAPINFOHEADER *pbih=new LPBITMAPINFOHEADER;
 FILE *fp;
 int length;

//

//Init pbih;
//

 fp = fopen(filename, "wb");
 if(!fp) return;

 bfh.bfSize = length;
 bfh.bfType = 0x4d42;
 bfh.bfOffBits = 54;
 bfh.bfReserved1 = 0;
 bfh.bfReserved2 = 0;

 fwrite((void *)&bfh, sizeof(BITMAPFILEHEADER), 1, fp);
 fwrite((void *)(pImage), 1, length, fp);
 fclose(fp);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值