VC++中,用CFile类,BMP位图打开使用Read和Write函数的问题
创建了一个CDib类,继承于CObject。想在其中编写两个各成员函数voidCDib::LoadFile(constchar*dibFileName);voidCDib...
创建了一个CDib类,继承于CObject。想在其中编写两个各成员函数
void CDib::LoadFile(const char*dibFileName);
void CDib::SaveFile(const char *filename);
分别在两个函数中,调用CFile对象的Read,和Write函数进行位图打开和存储。
其中:
在CDib头文件中,有几个关键的变量定义:
RGBQUAD*m_pRGB; // 理论上的颜色表首地址,至于有无颜色表它不做判断
BYTE *m_pData,*m_pData2; //m_pData,存储是位图的数据信息,很关键。
BITMAPFILEHEADER bitmapFileHeader; //文件信息头结构,其地址是文件的开头地址
BYTE *pDib; //位图数据信息的首地址,紧跟bitmapFileHeader地址的末尾
几个函数的实现在源文件里
void CDib::LoadFile(const char*dibFileName)
{strcpy(m_fileName,dibFileName);
CFile dibFile(m_fileName,CFile::modeRead);
dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));//把m_filename中前面的文件头信息读到以&bitmapFileHeader开始的连续地址里。
DWORD fileLength=dibFile.GetLength(); //求得整个文件的字节数
DWORD size=fileLength-sizeof(BITMAPFILEHEADER); //BMP文件除了文件头信息,剩余字节数
BYTE*pDib=(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE,size);//开辟一段存储空间
dibFile.Read((void*)pDib,size); //把m_filename下的文件从文件头之后的内容放到pDib为首的地址空间里。
dibFile.Close();
//理论上到这里已经把 m_filename所指的bmp文件内容全部拷到了临时开辟的以&bitmapFileHeader为首地址的,字节数为fileLength长度的空间里了。
m_pBitmapInfo=(BITMAPINFO*) pDib; //进行一些指针的记录。
m_pBitmapInfoHeader=(BITMAPINFOHEADER*)pDib;
m_pRGB=(RGBQUAD*)(pDib+m_pBitmapInfoHeader->biSize); //理论上颜色表首地址,如果是24位色则是像素数据首地址,因为24位色没有颜色表
colorTableSize=0; // 我打开的是24位色彩的,所以颜色表长度为0
m_pData=pDib+m_pBitmapInfoHeader->biSize+colorTableSize; //m_pData存的是图像像素数据首地址,因为跨过了信息头以及颜色表
}
void CDib::SaveFile(const char * filename) //存放的目标路径
{CFile dibFile(filename,CFile::modeWrite|CFile::modeCreate); //把目标路径指针,以及读写方式赋给CFile对象
dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
dibFile.WriteHuge(pDib,fileLength-sizeof(BITMAPFILEHEADER));
//由于bitmapFileHeader是在CDib里定义的全局变量,&bitmapFileHeader放置的是刚才临时开辟的存储空间的首地址,里面放的是已经打开的位图的所有字节,所以现在将,&bitmapFileHeader开始,fileLength长度字节的内容考到目标路径下去,即filename
dibFile.Close();
}
问题:1.我现在在一个按钮的消息函数里,使用语句
this->LoadFile("F:\\tu_1.bmp");
this->SaveFile("F:\\tu_2.bmp");
编译连接都没问题,但是我在运行程序是,当我点击按钮时,也就是进行图片打开和保存时,弹出错误对话框 Debug assertion failed。
然后在SaveFile的实现里分别设置两个断点
1. dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
2.dibFile.WriteHuge(pDib,fileLength-sizeof(BITMAPFILEHEADER));
发现程序运行到了1,但是2却没运行。 pDib指针存的是临时开辟的空间里,位图数据信息的首地址,为什么这里会出错呢 展开
void CDib::LoadFile(const char*dibFileName);
void CDib::SaveFile(const char *filename);
分别在两个函数中,调用CFile对象的Read,和Write函数进行位图打开和存储。
其中:
在CDib头文件中,有几个关键的变量定义:
RGBQUAD*m_pRGB; // 理论上的颜色表首地址,至于有无颜色表它不做判断
BYTE *m_pData,*m_pData2; //m_pData,存储是位图的数据信息,很关键。
BITMAPFILEHEADER bitmapFileHeader; //文件信息头结构,其地址是文件的开头地址
BYTE *pDib; //位图数据信息的首地址,紧跟bitmapFileHeader地址的末尾
几个函数的实现在源文件里
void CDib::LoadFile(const char*dibFileName)
{strcpy(m_fileName,dibFileName);
CFile dibFile(m_fileName,CFile::modeRead);
dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));//把m_filename中前面的文件头信息读到以&bitmapFileHeader开始的连续地址里。
DWORD fileLength=dibFile.GetLength(); //求得整个文件的字节数
DWORD size=fileLength-sizeof(BITMAPFILEHEADER); //BMP文件除了文件头信息,剩余字节数
BYTE*pDib=(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE,size);//开辟一段存储空间
dibFile.Read((void*)pDib,size); //把m_filename下的文件从文件头之后的内容放到pDib为首的地址空间里。
dibFile.Close();
//理论上到这里已经把 m_filename所指的bmp文件内容全部拷到了临时开辟的以&bitmapFileHeader为首地址的,字节数为fileLength长度的空间里了。
m_pBitmapInfo=(BITMAPINFO*) pDib; //进行一些指针的记录。
m_pBitmapInfoHeader=(BITMAPINFOHEADER*)pDib;
m_pRGB=(RGBQUAD*)(pDib+m_pBitmapInfoHeader->biSize); //理论上颜色表首地址,如果是24位色则是像素数据首地址,因为24位色没有颜色表
colorTableSize=0; // 我打开的是24位色彩的,所以颜色表长度为0
m_pData=pDib+m_pBitmapInfoHeader->biSize+colorTableSize; //m_pData存的是图像像素数据首地址,因为跨过了信息头以及颜色表
}
void CDib::SaveFile(const char * filename) //存放的目标路径
{CFile dibFile(filename,CFile::modeWrite|CFile::modeCreate); //把目标路径指针,以及读写方式赋给CFile对象
dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
dibFile.WriteHuge(pDib,fileLength-sizeof(BITMAPFILEHEADER));
//由于bitmapFileHeader是在CDib里定义的全局变量,&bitmapFileHeader放置的是刚才临时开辟的存储空间的首地址,里面放的是已经打开的位图的所有字节,所以现在将,&bitmapFileHeader开始,fileLength长度字节的内容考到目标路径下去,即filename
dibFile.Close();
}
问题:1.我现在在一个按钮的消息函数里,使用语句
this->LoadFile("F:\\tu_1.bmp");
this->SaveFile("F:\\tu_2.bmp");
编译连接都没问题,但是我在运行程序是,当我点击按钮时,也就是进行图片打开和保存时,弹出错误对话框 Debug assertion failed。
然后在SaveFile的实现里分别设置两个断点
1. dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
2.dibFile.WriteHuge(pDib,fileLength-sizeof(BITMAPFILEHEADER));
发现程序运行到了1,但是2却没运行。 pDib指针存的是临时开辟的空间里,位图数据信息的首地址,为什么这里会出错呢 展开
2个回答
展开全部
不懂你这个程序为什么会编译通过
因为 fileLength 不是全局变量,而是一个在LoadFile函数里定义的局部变量,这个函数结束,这个变量就被销毁了;那么在SaveFile函数里,这个变量根本不能被识别,请告诉我为什么会编译成功。。。
因为 fileLength 不是全局变量,而是一个在LoadFile函数里定义的局部变量,这个函数结束,这个变量就被销毁了;那么在SaveFile函数里,这个变量根本不能被识别,请告诉我为什么会编译成功。。。
追问
不好意思,我说漏了,fileLength有在该类的头文件中定义了:DWORD fileLength,不过初始化值是在LoadFile这个函数里的。不知道是不是文件路径指针类型的原因呢,需不需要在写之前为目标路径开辟内存呢,不知道能不能给一个简单的用CFile读写位图的例子,主要是写
展开全部
void CDib::SaveFile(const char * filename) //存放的目标路径
{CFile dibFile(filename,CFile::modeWrite|CFile::modeCreate); dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
dibFile.WriteHuge(pDib,fileLength-sizeof(BITMAPFILEHEADER)); //这里的fileLength在那里初始化的?
dibFile.Close();
}
{CFile dibFile(filename,CFile::modeWrite|CFile::modeCreate); dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
dibFile.WriteHuge(pDib,fileLength-sizeof(BITMAPFILEHEADER)); //这里的fileLength在那里初始化的?
dibFile.Close();
}
追问
DWORD fileLength=dibFile.GetLength(); //在LoadFile的实现里面第四行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询