用mfc编写数字图像处理程序读取BMP图像时出现问题 10C

图一为该程序中读取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
图片说明图片说明
跪求大神指导!!

5个回答

doc的image被置为null了,或者你的doc重新加载,image没有创建成功。

LegendFateX
LegendFateX 回复feelcycle_07: 但是如果只是打开一个bmp文件是可以打开的,就是不能保存或者进行别的操作
接近 2 年之前 回复

不愿意发代码啊,那我把我之前做的读图片发来看看吧,我觉得你那个读取应该是有问题的

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;

}

phenix2009
白色一大坨 这是从一个位图中读取到其数据进行转换的操作,你只看一下如何读取就可以,去掉那个转换函数可以直接用
接近 2 年之前 回复

这个地方的内存是不是有问题

LegendFateX
LegendFateX 回复cxh194311: 我也不太清楚,文件是可以正常打开显示的,就是不能进行别的操作
接近 2 年之前 回复

你打开文件后没对doc类中的image变量赋值,image如何赋值在什么时候赋值要看你的具体代码,你之前发的代码都没有和这相关的。

LegendFateX
LegendFateX 回复vithing: Image那个位置我改好了,但是前面bmp保存的方法仍然有问题
接近 2 年之前 回复

image对象已经不是之前那个那个了!!! pDoc指针又是个局部变量,每次执行完后是会销毁的,你在创建的话和之前打开的那个是两个不同的实体,自然是无法读到数据的啊。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问