| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 814 人关注过本帖
标题:详解用VC实现bmp位图的打开
只看楼主 加入收藏
jack12
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-2-20
结帖率:0
收藏
已结贴  问题点数:20 回复次数:3 
详解用VC实现bmp位图的打开
我按照网上的程序编写(http://www.),结果出现fatal error C1010: unexpected end of file while looking for precompiled header directive这样的错误。我添加了头文件#include "StdAfx.h",结果错误更多。也不知道怎么解决,麻烦哪位帮帮我吧!
test2.rar (1.74 MB)
以下是Dib.cpp的源代码,编译就说这里有错误。
#include "windowsx.h"
#include "Dib.h"
//#include "StdAfx.h"


CDib::CDib()

{

    size=0;//构造函数初始化size

}

CDib::CDib()

{

GlobalFreePtr(m_pBitmapInfo); //详见说明(1)

}

void CDib::LoadFile(const char* dibFileName)

{

    strcpy(m_fileName,dibFileName);//将路径名称拷贝到m_fileName之中

    CFile dibFile(m_fileName, CFile::modeRead);//创建CFile类对象,只读方式

    dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));//读取文件头的内容

    if (bitmapFileHeader.bfType == 0x4d42)//判断是否为bmp格式,单步调试你会发现,此时的bfType值并非0x4d42,而是19778.注意,这是十进制,只要转换成十六进制即为0x4d42

    {

        DWORD fileLength = dibFile.GetLength();//读取文件的大小,你可以试试跟踪此值来看看它是否和你要打开的图片大小一致

         size = fileLength -sizeof(BITMAPFILEHEADER);//文件大小-文件头结构体的大小,此时你会发现,文件头的大小的确是14字节

         pDib =(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE, size);//详见说明(2)

        dibFile.Read((void*)pDib, size);//通过读取,把读出的数据存入刚才分配的内存之中

        dibFile.Close();//文件操作完成之后关闭文件

        m_pBitmapInfo = (BITMAPINFO*) pDib;//BITMAPINFO结构体指针指向该内存

        m_pBitmapInfoHeader = (BITMAPINFOHEADER*) pDib;//信息头指向该内存

        m_pRGB = (RGBQUAD*)(pDib +

    m_pBitmapInfoHeader->biSize);//调色板指针指向该内存的调色板部分。因为pDib原本指向信息头,偏移40字节(信息头结构体的大小)之后便到了调色板部分,因此用加法来实现指针的偏移

        int m_numberOfColors = GetNumberOfColors();//调用GetNumberOfColors函数来得到颜色数

        if (m_pBitmapInfoHeader->biClrUsed == 0)

            m_pBitmapInfoHeader->biClrUsed =

       m_numberOfColors;//把颜色数赋予biClrUsed之中

        DWORD colorTableSize = m_numberOfColors *

            sizeof(RGBQUAD);//用每个调色板结构体大小乘以颜色数量,得到调色板的大小

        m_pData = pDib + m_pBitmapInfoHeader->biSize

            + colorTableSize;//这时候代表把m_pData指针指向实际图像数据了

   if (m_pRGB == (RGBQUAD*)m_pData) // 如果调色板指针位置和实际图像位置指针指向位置相同,那就代表没有调色板

    m_pRGB = NULL;//指针赋予空

        m_pBitmapInfoHeader->biSizeImage = GetSize();//赋予实际位图的大小

   m_valid = TRUE;

    }   

    else//如果不是bmp位图则失败

    {

        m_valid = FALSE;

        AfxMessageBox("This isn't a bitmap file!");

    }

}

DWORD CDib::GetSize()

{

    if (m_pBitmapInfoHeader->biSizeImage != 0)

        return m_pBitmapInfoHeader->biSizeImage;

else

    {

        DWORD height = (DWORD) GetHeight();

        DWORD width = (DWORD) GetWidth();

        return height * width;

    }

}

UINT CDib::GetWidth()

{

    return (UINT) m_pBitmapInfoHeader->biWidth;

}

UINT CDib::GetHeight()

{

    return (UINT) m_pBitmapInfoHeader->biHeight;

}

UINT CDib::GetNumberOfColors()

{

    int numberOfColors;

    if ((m_pBitmapInfoHeader->biClrUsed == 0) &&

          (m_pBitmapInfoHeader->biBitCount < 9))

//biClrUsed表示实际用到的颜色数,若0为2的 biBitCount次中颜色

//biBitCount为用到的颜色的位数,小于 9则表示最大为8位,那么之多为256色

{

   switch (m_pBitmapInfoHeader->biBitCount)

   {

      case 1: numberOfColors = 2; break;

      case 4: numberOfColors = 16; break;

      case 8: numberOfColors = 256;

   }

}

    else

   numberOfColors = (int) m_pBitmapInfoHeader->biClrUsed;//若不是上面的情况,则直接返回颜色数

    return numberOfColors;

}

搜索更多相关主题的帖子: 源代码 
2011-02-20 23:27
ybdesire
Rank: 2
等 级:论坛游民
威 望:1
帖 子:49
专家分:10
注 册:2007-5-19
收藏
得分:10 
    别用上面那套方法了,建议你用OpenCV, 看看这里就知道他有多方便了http://www.
    我是摸爬滚打了多年才发现的... ...
2011-02-22 12:33
jack12
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-2-20
收藏
得分:0 
谢谢啊!我知道这个好用,也有同学推荐了。但我们必须用这个
2011-02-22 19:29
baisongasd
Rank: 2
等 级:论坛游民
帖 子:14
专家分:40
注 册:2011-1-12
收藏
得分:10 
好像是头文件少了什么
2011-02-25 09:11
快速回复:详解用VC实现bmp位图的打开
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017541 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved