Ford_66 2018-05-19 13:22 采纳率: 0%
浏览 789
已结题

为什么BMP文件保存后,图像发生平移?

请教一下各位大神,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();
}
  • 写回答

6条回答 默认 最新

  • devmiao 2018-05-19 13:53
    关注

    用winhex/ultraedit看下,保存的文件的文件头是否有问题。

    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料