1、参考网址:
http://blog.sina.com.cn/s/blog_678b377a0100mlyb.html
http://blog.csdn.net/weiyongtao87/article/details/8290500
1.1、
#include <stdio.h> #include <windows.h> #define DIB_HEADER_MARKER ( (WORD)('M' << 8) | 'B' ) DECLARE_HANDLE(HDIB); // DIB句柄 (ZC: 貌似就是定义一个句柄类型) void main() { char* pcFullFileName = ""; HANDLE hFile = CreateFile(pcFullFileName, GENERIC_READ, //必须有GENERIC_READ属性才能得到时间 FILE_SHARE_READ, NULL, OPEN_EXISTING,//TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { return; } // 第一步:判定文件是不是bmp文件。从文件里读取头文件,然后读取文件头的类型属性。 ::SetFilePointer(hFile, 0, NULL, FILE_BEGIN);// 指针移动(文件偏移) BITMAPFILEHEADER bmfHeader = {0}; DWORD dwRead = 0; // 尝试读取DIB文件头 if (! ReadFile(hFile, &bmfHeader, sizeof(bmfHeader), &dwRead, NULL)) { return; } if ( sizeof(bmfHeader) != dwRead ) { // 大小不对 return; } // 判断是否是DIB对象,检查头两个字节是否是"BM" if (bmfHeader.bfType != DIB_HEADER_MARKER) { // 非DIB对象 return; } // 第二步:用文件的字节数减去文件头的字节数后,读取后面的数据即是bmp的像素。 // 获取DIB(文件)长度(字节) DWORD dwBitsSize = GetFileSize(hFile, NULL);// 文件大小 // 为DIB分配内存 HDIB hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);// // ZC: 这里需要分配这么大的空间吗?(连BITMAPFILEHEADER占的空间也一起分配进去了) if (hDIB == 0) { // 内存分配失败 return; } // 锁定 void* pMem = ::GlobalLock( (HGLOBAL)hDIB ); // 读象素 ::SetFilePointer(hFile, sizeof(bmfHeader), NULL, FILE_BEGIN); dwRead = 0; if (! ReadFile(hFile, pMem, dwBitsSize - sizeof(BITMAPFILEHEADER), &dwRead, NULL)) { return; } if (dwRead != dwBitsSize - sizeof(BITMAPFILEHEADER) ) { // 大小不对。 // 解除锁定 ::GlobalUnlock((HGLOBAL)hDIB); // 释放内存 ::GlobalFree(pMem); return; } // 解除锁定 ::GlobalUnlock((HGLOBAL) hDIB); } // 一、 // 对于24位bmp图片,每一个像素点存放着此点的RGB值。 // 首先定义一个结构体,包含红(red)、绿(green)、蓝(blue)这三个字段,如下: //像素颜色值 typedef struct tagPOINTZ { BYTE b; BYTE g; BYTE r; } POINTZ; void TestZ(BITMAPINFOHEADER _bih, FILE* _f) { int i=0, j=0; // 二、 // 接下来定义用来存放每一像素点RGB值的变量,为了与bmp图像的行、列对应,定义存放数据的变量如下: POINTZ **pix; // 其中,pix[i][j]代表第i行j列处像素点的RGB值。 // 根据bmp图像宽与高,为指针变量动态分配内存空间,如下所示: //为标准图像每一个像素申请内存 pix = (POINTZ **)malloc(sizeof(POINTZ*) * _bih.biHeight); for(i=0; i<_bih.biHeight; i++) *(pix+i) = (POINTZ*)malloc(sizeof(POINT) * _bih.biWidth); // 其中,bi_in.biHeight为图像高度,bi_in.biWidth为图像宽度。 // 读取图像每一像素点处的RGB值至pix变量中,如下: //读取图像数据 for(i=0; i<_bih.biHeight; i++) for(j=0; j<_bih.biWidth; j++) fread(*(pix+i)+j, sizeof(POINTZ), 1, _f); // 现在,pix变量中就存放了整幅图像数据。可以通过下标或者指针运算读取任意点处的RGB值。 }
2、
3、
4、
5、