BMP操作_测试

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、

原文地址:https://www.cnblogs.com/cppskill/p/8057539.html