读书人

BMP保存有关问题

发布时间: 2012-01-18 00:23:26 作者: rapoo

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

读书人网 >VC/MFC

热点推荐