#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;
}
上面的代码是我能以最简单的代码呈现了,如果有问题
对应的图片是这个
下面这里有文字说明大家可以稍微结合着看