• 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、

  • 相关阅读:
    新浪微盘又是一个给力的产品啊,
    InfoQ: 百度数据库架构演变与设计
    列式数据库——Sybase IQ
    MapR初体验 淘宝共享数据平台 tbdata.org
    IBM正式发布新一代zEnterprise大型机(组图) 大型机,IBM,BladeCenter,美国,纽约 TechWeb News
    1TB is equal to the number of how many GB? 1PB equal to is equal to the number of TB? 1EB PB? | PCfault.com
    Cassandra vs HBase | WhyNosql
    The Hadoop Community Effect
    雅虎剥离开源软件平台 Hadoop ,与风投新建 Hortonworks 公司 品味雅虎
    RowOriented Database 、ColumnOriented Database 、KeyValue Store Database 、DocumentOriented Database
  • 原文地址:https://www.cnblogs.com/cppskill/p/8057539.html
Copyright © 2020-2023  润新知