灰度图像的保存?

yangyunlong 2006-08-04 10:47:05
有unsigned char *bBuf ,是256级灰度图像数据,已知width,height,请问如何将其保存位一个灰度的bmp,保存后的文件属性里[颜色表示:灰度级 比特深度:8]
...全文
514 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pomelowu 2006-08-08
  • 打赏
  • 举报
回复
http://www.yesky.com/322/195322.shtml

256色总是有调色版的。。。你可以读一幅属性为“[颜色表示:灰度级 比特深度:8]”的256色位图的位图数据前的部分,和你写入的部分对比下,看看差距在什么地方
yangyunlong 2006-08-07
  • 打赏
  • 举报
回复
我上次写了一个,当时存完发现保存后的文件属性里是 [颜色表示:调色 比特深度:8],而不是[颜色表示:灰度级 比特深度:8]请各位帮忙看看。

BOOL SaveModel(CString strFileName, unsigned char *lpDIBBits, LONG lWidth, LONG lHeight)
{

BITMAPFILEHEADER bmfHdr;
CFile file;
if (!file.Open(strFileName, CFile::modeCreate |
CFile::modeReadWrite | CFile::shareExclusive, NULL))
{

return FALSE;
}
DWORD dwDIBSize;
BITMAPINFO* pBitmapInfo ;
pBitmapInfo = NULL ;
unsigned int bitmapInfoSize= 0 ;
unsigned short* palColorIx = NULL;
bitmapInfoSize = sizeof(BITMAPINFO)+ 255*sizeof(unsigned short);
pBitmapInfo = (BITMAPINFO *) new BYTE[bitmapInfoSize];
pBitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pBitmapInfo->bmiHeader.biPlanes = 1;
pBitmapInfo->bmiHeader.biBitCount = 8;
pBitmapInfo->bmiHeader.biCompression = BI_RGB;
pBitmapInfo->bmiHeader.biSizeImage = 0 ;
pBitmapInfo->bmiHeader.biXPelsPerMeter= 0;
pBitmapInfo->bmiHeader.biYPelsPerMeter= 0;
pBitmapInfo->bmiHeader.biClrUsed = 0;
pBitmapInfo->bmiHeader.biClrImportant = 0;
pBitmapInfo->bmiHeader.biWidth = lWidth;
pBitmapInfo->bmiHeader.biHeight = lHeight;
palColorIx = (unsigned short*)&pBitmapInfo->bmiColors[0];
for (int i = 0 ; i < 256 ; i++)
palColorIx[i] = (unsigned short)i;
bmfHdr.bfType =((WORD) ('M' << 8) | 'B');

dwDIBSize =sizeof(BITMAPINFO)+ 255*sizeof(unsigned short)+ sizeof(PLOGPALETTE)+ 256 * sizeof(PALETTEENTRY);

DWORD dwBmBitsSize;

dwBmBitsSize = WIDTHBYTES(lWidth*8) * lHeight;
dwDIBSize += dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;

bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ sizeof(PLOGPALETTE)+ 256 * sizeof(PALETTEENTRY);

pBitmapInfo->bmiHeader.biSizeImage = dwBmBitsSize ;

unsigned int un32LoopI;
PLOGPALETTE pLogPalette;
pLogPalette = (PLOGPALETTE)new BYTE[sizeof(LOGPALETTE) + 256 * sizeof(PALETTEENTRY)];
pLogPalette->palNumEntries = 256;
pLogPalette->palVersion = 0x300;// version number defined by Windows (must be 0x300)
for (un32LoopI = 0 ; un32LoopI < 256 ; un32LoopI++)
{
pLogPalette->palPalEntry[un32LoopI].peRed = (BYTE)un32LoopI;
pLogPalette->palPalEntry[un32LoopI].peGreen = (BYTE)un32LoopI;
pLogPalette->palPalEntry[un32LoopI].peBlue = (BYTE)un32LoopI;
pLogPalette->palPalEntry[un32LoopI].peFlags = NULL;
}// 写文件头
file.Write((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER));
file.Write((LPSTR)pBitmapInfo, sizeof(BITMAPINFOHEADER));
file.Write((LPSTR)pLogPalette, sizeof(PLOGPALETTE)+ 256 * sizeof(PALETTEENTRY));
file.WriteHuge(lpDIBBits, dwBmBitsSize);



return TRUE;

}
xyq1986 2006-08-07
  • 打赏
  • 举报
回复
去看看8位位图的格式吧,再用指针之类的写一下,就OK了,8位的有调色板,红蓝位置要颠倒
kencharles 2006-08-06
  • 打赏
  • 举报
回复
楼上的说得对!
langzi8818 2006-08-05
  • 打赏
  • 举报
回复
楼主想想其实很简单,把改添的添好。就是了
pomelowu 2006-08-04
  • 打赏
  • 举报
回复
http://blog.csdn.net/pomelowu/articles/111056.aspx#p2.6
根据文件格式,填写 BITMAPFILEHEADER BITMAPINFOHEADER 和 Color-index array就行了。Color-index array就是你那个数组。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧