图一为该程序中读取BMP的代码
BOOL CImageDoc::ReadBMP(LPCTSTR lpszPathName)
{
long lTotal = 0;
CFile file;
file.Open(lpszPathName, CFile::modeRead);
file.Read(&bmpFH, sizeof(BITMAPFILEHEADER));
lpbmi = (LPBITMAPINFO)new char[sizeof(BITMAPINFO) + 4 * (1 << 8)];
file.Read(lpbmi, sizeof(BITMAPINFOHEADER));
m_nColorBits = lpbmi->bmiHeader.biBitCount;
imageHeight = lpbmi->bmiHeader.biHeight;
imageWidth = lpbmi->bmiHeader.biWidth;
if (m_nColorBits == 8)
{
lTotal = imageWidth * imageHeight;
file.Read(&(lpbmi->bmiColors[0]), 256 * 4);
}
else if (m_nColorBits == 24)
{
lTotal = imageWidth * imageHeight * 3;
}
else
{
file.Close();
return FALSE;
}
m_pBits = new unsigned char[lTotal];
file.Read(m_pBits, lTotal);
file.Close();
return TRUE;
}
图二为该程序中保存BMP的代码
BOOL CLufangxiaoImageDoc::SaveBMP(LPCTSTR lpszPathName)
{
long lTotal = 0;
CFile file;
file.Open(lpszPathName, CFile::modeCreate | CFile::modeReadWrite);
file.Write(&bmpFH, sizeof(BITMAPFILEHEADER));
file.Write(lpbmi, sizeof(BITMAPINFOHEADER));
if (m_nColorBits == 8)
{
lTotal = imageWidth * imageHeight;
file.Write(&(lpbmi->bmiColors[0]), 256 * 4);
}
else if (m_nColorBits == 24)
{
lTotal = imageWidth * imageHeight * 3;
}
else
{
file.Close();
return FALSE;
}
file.Write(m_pBits, lTotal);
file.Close();
return TRUE;
}
保存图像之后出现无法打开的情况
图三和图四为对图像实现操作的代码,只要运行到有pDoc->image的位置就会报错,提示pDoc->image是nullptr
跪求大神指导!!
这个地方的内存是不是有问题
doc的image被置为null了,或者你的doc重新加载,image没有创建成功。
你打开文件后没对doc类中的image变量赋值,image如何赋值在什么时候赋值要看你的具体代码,你之前发的代码都没有和这相关的。
不愿意发代码啊,那我把我之前做的读图片发来看看吧,我觉得你那个读取应该是有问题的
int LoadBmpFromFile(LPCTSTR lpszFileName)//参数为图片路径
{
BITMAPFILEHEADER BmpFileHeader;
FILE* pFile;
int ret = fopen_s(&pFile, lpszFileName, "rb+");
if (ret != 0) return -1;
fread(&BmpFileHeader, sizeof(BmpFileHeader), 1, pFile);
if (BmpFileHeader.bfType != 0x4d42) return -1;
LPBITMAPINFO pBmpInfo = NULL;
pBmpInfo = (LPBITMAPINFO)new char[sizeof(BITMAPINFOHEADER)+256 * sizeof(RGBQUAD)];
fread(pBmpInfo, BmpFileHeader.bfOffBits - sizeof(BITMAPFILEHEADER), 1, pFile);
m_lWidth = pBmpInfo->bmiHeader.biWidth;
m_lHeight = pBmpInfo->bmiHeader.biHeight;
m_wBitCount = pBmpInfo->bmiHeader.biBitCount;
delete[] pBmpInfo;
pBmpInfo = NULL;
int nLineByte = (m_lWidth * m_wBitCount + 31) / 32 * 4;
int nDatalen = nLineByte * m_lHeight;
if (m_pbtBmpBuf != NULL){ delete[] m_pbtBmpBuf; m_pbtBmpBuf = NULL; }
m_pbtBmpBuf = new BYTE[nDatalen];
BYTE *pImageTemp = new BYTE[nDatalen];
memset(pImageTemp, 0, nDatalen);
fread(pImageTemp, nDatalen, 1, pFile);
fclose(pFile);
ConvertBmpdata(m_pbtBmpBuf, pImageTemp, m_lWidth, m_lHeight, m_wBitCount);
delete[] pImageTemp;
pImageTemp = NULL;
return 0;
}
image对象已经不是之前那个那个了!!! pDoc指针又是个局部变量,每次执行完后是会销毁的,你在创建的话和之前打开的那个是两个不同的实体,自然是无法读到数据的啊。