zoukankan      html  css  js  c++  java
  • 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、

  • 相关阅读:
    UCSC genome browser 个人track 安装
    C++遍历二维数组的四种方法
    生物结构变异分析软件meerkat 0.189使用笔记(一)
    R语言从小木虫网页批量提取考研调剂信息
    使用R语言将微信记录制作成词云(简洁)--情人节奥义
    判断数据是否服从某一分布(二)——简单易用fitdistrplus包
    判断数据是否服从某一分布(一)
    如何正确地写出单例模式
    使用 JavaScript 将网站后台的数据变化实时更新到前端-【知乎总结】
    C#实时读取数据----局部页面刷新【转】
  • 原文地址:https://www.cnblogs.com/cppskill/p/8057539.html
Copyright © 2011-2022 走看看