首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

BMP保存有关问题

2012-01-18 
BMP保存问题请问一下,我BMP保存时总是出现错位问题如本来图为:123456789123456789123456789123456789保存

BMP保存问题
请问一下,我BMP保存时总是出现错位问题
如本来图为:
123456789
123456789
123456789
123456789

保存后打开变成了
789123456
789123456
789123456
789123456

保存图片代码为:

CFile   myFile(hFile);

BITMAPFILEHEADER   bmfHeader;
ZeroMemory(&bmfHeader,sizeof(bmfHeader));
bmfHeader.bfType=0x4D42;   //   "BM "  
bmfHeader.bfReserved1   =   0;  
bmfHeader.bfReserved2   =   0;
bmfHeader.bfOffBits   =   54;
//sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);  
bmfHeader.bfSize=resultBmpHeadInfo.biSizeImage   +   54;

myFile.Write(&bmfHeader,   14);
myFile.Write(&resultBmpHeadInfo,   40);
myFile.Write(resultBmp,resultBmpHeadInfo.biSizeImage);

myFile.Close();


[解决办法]
用二进制打开文件
[解决办法]
BOOL CDib::SaveFile(HGLOBAL hDib, CFile& file)
{
if (hDib == NULL)
{
return FALSE;// 如果DIB为空,返回FALSE
}
lpbmihrd = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib);// 读取BITMAPINFO结构,并锁定
if (lpbmihrd == NULL)
{
return FALSE;// 为空,返回FALSE
}
bmfHeader.bfType = DIB_MARKER;// 填充文件头
dwDIBSize = *(LPDWORD)lpbmihrd + GetPalSize((LPSTR)lpbmihrd);// 文件头大小+颜色表大小
DWORD dwBmBitsSize;// 像素的大小
dwBmBitsSize =GetReqByteWidth((lpbmihrd-> biWidth)*((DWORD)lpbmihrd-> biBitCount)) * lpbmihrd-> biHeight;// 大小为Width * Height
dwDIBSize += dwBmBitsSize;// 计算后DIB每行字节数为4的倍数时的大小
lpbmihrd-> biSizeImage = dwBmBitsSize;// 更新biSizeImage
bmfHeader.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);// 文件大小
bmfHeader.bfReserved1 = 0;// 两个保留字
bmfHeader.bfReserved2 = 0;
bmfHeader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpbmihrd-> biSize// 计算偏移量bfOffBits
+ GetPalSize((LPSTR)lpbmihrd);
TRY
{
file.Write(&bmfHeader, sizeof(BITMAPFILEHEADER));// 写文件头
file.WriteHuge(lpbmihrd, dwDIBSize);// 写DIB头和像素
}
CATCH (CFileException, e)
{
::GlobalUnlock((HGLOBAL) hDib);// 解除锁定
THROW_LAST();// 抛出异常
}
END_CATCH
::GlobalUnlock((HGLOBAL) hDib);// 解除锁定
return TRUE;// 返回TRUE
}


[解决办法]
你指针数据位置有问题.
位图是从下往上写的
[解决办法]
resultBmpHeadInfo.biSizeImage
-----------------------------------
你的这个值是如何算的?这里有一个4字节边界问题。
还有就是颜色查找表的问题
如果你用的RGB图像那没问题。不是的话,就要在偏移量那里加上颜色查找表所占字节数。
[解决办法]
左右错位是位移的问题,图像数据的位移肯定是和Header结构体里定义的不一样
[解决办法]
那肯定是 一行数据不是4的倍数 在后面补起就可以了
[解决办法]
嗯,看是否每行错位是否不一样,如果每行不一样就是对齐问题.

BMP每行字节数是4的倍数.如果是32位就没对齐问题.如果小于32位要补0

热点排行