详解用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;
}