最简单的24位位图结构解析

#include "stdafx.h"
#include <stdio.h>


unsigned char data[374] = {
	0x42, 0x4D, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, 
	0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
	0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 
	0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 
	0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
	0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 
	0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 
	0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
	0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 
	0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 
	0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
	0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 
	0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 
	0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
	0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 
	0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 
	0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00
};

BOOL PareseBitmap(void* pBitMapData,int nSize)
{
	byte* pData = (byte*)pBitMapData;
// 	1.位图文件头(bitmap-file header
// 	2.位图信息头(bitmap-information header)
// 	3.颜色表(color table)
// 	4.颜色点阵数据(bits data)
// 	24位真彩色位图没有颜色表,所以只有1、2、4这三部分

// 	typedef struct tagBITMAPFILEHEADER{
// 		WORD      bfType; // 位图文件的类型,必须为BM
// 		DWORD    bfSize; // 位图文件的大小,以字节为单位
// 		WORD       bfReserved1; // 位图文件保留字,必须为0
// 		WORD       bfReserved2; // 位图文件保留字,必须为0
// 		DWORD    bfOffBits; // 位图数据的起始位置,以相对于位图
// 		// 文件头的偏移量表示,以字节为单位
// 	} BITMAPFILEHEADER;

	BITMAPFILEHEADER* pBmpFileHeader =(BITMAPFILEHEADER*)pData;
	if( pBmpFileHeader->bfType != 0x4d42 )
		return FALSE;

// 	typedef struct tagBITMAPINFOHEADER{
// 	  DWORD biSize; // 本结构所占用字节数(15-18字节)
// 	  LONG biWidth; // 位图的宽度,以像素为单位(19-22字节)
// 	  LONG biHeight; // 位图的高度,以像素为单位(23-26字节)
// 	  WORD biPlanes; // 目标设备的级别,必须为1(27-28字节)
// 	  WORD biBitCount;// 每个像素所需的位数,必须是1(双色),(29-30字节) // 4(16色),8(256色)或24(真彩色)之一
// 	  DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),(31-34字节) // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
// 	  DWORD biSizeImage; // 位图的大小,以字节为单位(35-38字节)
// 	  LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数(39-42字节)	
// 	  LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数(43-46字节)	
// 	  DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数(47-50字节)
// 	  DWORD biClrImportant;// 位图显示过程中重要的颜色数(51-54字节)		
// 	  } BITMAPINFOHEADER;
	BITMAPINFOHEADER* pBmpInfoHeader = (BITMAPINFOHEADER*)( pData + sizeof(BITMAPFILEHEADER) );
	if (pBmpInfoHeader->biSize != sizeof(BITMAPINFOHEADER))
		return FALSE;

	byte* pBmpdata = pData+pBmpFileHeader->bfOffBits;


	//备注: BMP规定 一行必须以4个字节对齐
	//一行占多少个字节
	DWORD dwBytesPerLine       = (pBmpInfoHeader->biWidth* pBmpInfoHeader->biBitCount+31)/32*4;
	DWORD dwPerLinePadding     = dwBytesPerLine - pBmpInfoHeader->biWidth;
	
	if (dwBytesPerLine * pBmpInfoHeader->biHeight != pBmpInfoHeader->biSizeImage )
	{
		return FALSE;
	}


	for (LONG dwRow = 0; dwRow < pBmpInfoHeader->biHeight; dwRow++)
	{
		for (LONG dwCol = 0; dwCol < pBmpInfoHeader->biWidth; dwCol++)
		{
			BYTE bPixB = pBmpdata[(pBmpInfoHeader->biHeight-dwRow-1) *dwBytesPerLine+dwCol*3];
			BYTE bPixG = pBmpdata[(pBmpInfoHeader->biHeight-dwRow-1) *dwBytesPerLine+dwCol*3+1];
			BYTE bPixR = pBmpdata[(pBmpInfoHeader->biHeight-dwRow-1) *dwBytesPerLine+dwCol*3+2];
			if (bPixB)
			{
				printf("0");
			}else
			{
				printf("1");
			}
			
		}
		printf("\r\n");
	}

// 	for (LONG dwRow = 0; dwRow < pBmpInfoHeader->biHeight; dwRow++)
// 	{
// 		for (LONG dwCol = 0; dwCol < pBmpInfoHeader->biWidth; dwCol++)
// 		{
// 			BYTE bPix = pBmpdata[dwRow*dwBytesPerLine+dwCol*3];
// 			if (bPix)
// 			{
// 				printf("0");
// 			}else
// 			{
// 				printf("1");
// 			}
// 			
// 		}
// 		printf("\r\n");
// 	}

//	pBmpInfoHeader->biXPelsPerMeter


	return TRUE;

}



int main(int argc, char* argv[])
{

	PareseBitmap(data,sizeof(data));

// 	CDib db;
// 	db.ReadBMPFile(_T("test.bmp"));
	return 0;
}

上面的代码是我能以最简单的代码呈现了,如果有问题

对应的图片是这个

下面这里有文字说明大家可以稍微结合着看

https://blog.csdn.net/lcalqf/article/details/42076169

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值