请教一下各位大神,SaveFile函数代码如下,为什么保存后的图像总会发生水平偏移(而且是循环反向序列)呢?(因为CSDN不能上传.bmp图片,故转换成.jpg图片)
求给个解决办法,谢谢!
代码块中涉及的变量有:
pDIB=(BYTE*)::GlobalLock(m_hDIB);//位图指针
pBFH=(BITMAPFILEHEADER*)pDIB;
pBIH=(BITMAPINFOHEADER*)&pDIB[sizeof(BITMAPFILEHEADER)];
pQuad=(RGBQUAD*)&pDIB[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
pBits=(BYTE*)&pDIB[pBFH->bfOffBits];
nWidth = pBIH->biWidth;
nHeight = pBIH->biHeight;
nBitCount = pBIH->biBitCount;
numquad=1<<nBitCount;//计算调色板数目
void ImageProc::SaveFile(void)
{
DWORD DIBSize;
LPCTSTR lpszFilter=_T("BMP Files(*.bmp)|*.bmp|任何文件|*.*||");
CFileDialog dlg(FALSE,lpszFilter,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,lpszFilter,NULL);
if (dlg.DoModal()!=IDOK)
{
return;
}
CFile file;
CFileException fe;
if (!file.Open(dlg.GetPathName(), CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive, &fe))
{
//ReportSaveLoadException(dlg.GetPathName(), &fe, TRUE, AFX_IDP_INVALID_FILENAME);//失败
return;
}
DIBSize=WIDTHBYTES(nWidth*nBitCount)*nHeight;//位图实际所占字节数计算公式
file.SeekToBegin();
file.Write(pBFH,sizeof(BITMAPFILEHEADER)); //文件头结构写进文件
file.Write(pBIH,sizeof(BITMAPINFOHEADER)); //文件信息头写入文件
file.Write(pQuad,sizeof(RGBQUAD)*numquad);//如果有颜色表,颜色表写进文件
file.Write(pDIB,DIBSize); //位图实际所占字节数写进文件
file.Close();
}