求助,256色(8位)BMP图如何设置调色板

freese7en 2009-12-27 09:07:19

我现在有8位BMP图的像素数据的指针,但是不知道如何设置调色板,请指教下,高分送。

以前用的代码如下,没调色板,存了后显示有误。

BITMAPFILEHEADER targetfileheader;
BITMAPINFOHEADER targetinfoheader;
memset(&targetfileheader,0,sizeof(BITMAPFILEHEADER));
memset(&targetinfoheader,0,sizeof(BITMAPINFOHEADER));

//构造位图的文件头
targetfileheader.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof

(BITMAPINFOHEADER);
targetfileheader.bfSize=longth*longth*8+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);


targetfileheader.bfReserved1=0;
targetfileheader.bfReserved2=0;
targetfileheader.bfType=DIB_MARKER;


//构造位图的信息头
targetinfoheader.biBitCount=8;
targetinfoheader.biSize=sizeof(BITMAPINFOHEADER);
targetinfoheader.biHeight=longth;
targetinfoheader.biWidth=longth;
targetinfoheader.biPlanes=1;
targetinfoheader.biCompression=BI_RGB;
targetinfoheader.biSizeImage=longth*longth;//+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
targetinfoheader.biXPelsPerMeter=0;
targetinfoheader.biYPelsPerMeter=0;
targetinfoheader.biClrImportant=0;
targetinfoheader.biClrUsed=0;

// LPCTSTR(imgname)
CFile cf;
if(!cf.Open("切取图像.bmp",CFile::modeCreate|CFile::modeWrite))
return ;
cf.Write(&targetfileheader,sizeof(BITMAPFILEHEADER));
cf.Write(&targetinfoheader,sizeof(BITMAPINFOHEADER));
cf.Write(pView->ppixle_CUT,longth*longth); // ppixle_CUT为像素指针
cf.Close();

请给出具体该怎么修改吧?感谢,第一个给出的 100分送上
...全文
1138 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lambochan 2009-12-28
  • 打赏
  • 举报
回复
对付8bit raw数据很简单,自己构造BMPINFO去搞定它,可以自制个彩色的colors table(或者灰度)去显示(or保存) :

// note: longth这个长宽变量必须是4的倍数,否则你这样填肯定就是错的!
// 这个没法帮你改,要不是4的倍数,自己重新分配内存去搞定~~


BITMAPFILEHEADER targetfileheader = { 0 };
BITMAPINFOHEADER targetinfoheader = { 0 };
// memset(&targetfileheader,0,sizeof(BITMAPFILEHEADER));
// memset(&targetinfoheader,0,sizeof(BITMAPINFOHEADER));

//构造位图的文件头
DWORD dwCTSize = sizeof( RGBQUAD ) * 256; // 8 bit colos table size..
targetfileheader.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER) + dwCTSize;
targetfileheader.bfSize=longth*longth+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + dwCTSize;
targetfileheader.bfReserved1=0;
targetfileheader.bfReserved2=0;
targetfileheader.bfType=DIB_MARKER;


//构造位图的信息头
targetinfoheader.biBitCount=8;
targetinfoheader.biSize=sizeof(BITMAPINFOHEADER);
targetinfoheader.biHeight=longth;
targetinfoheader.biWidth=longth;
targetinfoheader.biPlanes=1;
targetinfoheader.biCompression=BI_RGB;
targetinfoheader.biSizeImage=longth*longth;//+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

// 构造色彩表,这里用的是灰度..(当然,自己有色彩表直接memcpy也ok的)
RGBQUAD rgb[256] = { 0 };
for( int i = 0; i < 256; ++i ){
rgb[i].rgbBlue = rgb[i].rgbGreen = rgb[i].rgbRed = i;
}

// LPCTSTR(imgname)
CFile cf;
if(!cf.Open("切取图像.bmp",CFile::modeCreate|CFile::modeWrite))
return ;
cf.Write(&targetfileheader,sizeof(BITMAPFILEHEADER));
cf.Write(&targetinfoheader,sizeof(BITMAPINFOHEADER));
cf.Write( rgb, sizeof( RGBQUAD ) * 256 );
cf.Write(pView->ppixle_CUT,longth*longth); // ppixle_CUT为像素指针
cf.Close();
cnzdgs 2009-12-28
  • 打赏
  • 举报
回复
256色常用的调色板有很多种,你说的大概是这样:其中两种颜色的取值范围是00、20、40、60、80、A0、C0、FF,另一种颜色的取值范围是00、40、80、FF,调色板数据是这个样子:
00 00 00 00
00 00 40 00
00 00 80 00
00 00 FF 00
00 20 00 00
00 20 40 00
00 20 80 00
00 20 FF 00
00 40 00 00
00 40 40 00
00 40 80 00
00 40 FF 00
……
可以用一个三重循环(8*8*4)来填写。
fandh 2009-12-27
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20040509/17/3046608.html
楼主看看这个!关于调色板的!
freese7en 2009-12-27
  • 打赏
  • 举报
回复
应该是bgr分别相同是0-255建立的颜色表

我手边没书

谁能在我的代码中添加下颜色表的建立 100分都给你
laviewpbt 2009-12-27
  • 打赏
  • 举报
回复
你只有8位BMP的数据部分,而没有调色板,说明你得到的信息不完整,无法复原图像。
freese7en 2009-12-27
  • 打赏
  • 举报
回复

没用
cnzdgs 2009-12-27
  • 打赏
  • 举报
回复
像素数据是怎么得到的?从哪得到的像素数据就从哪获取调色板。
gamedragon 2009-12-27
  • 打赏
  • 举报
回复
BITMAPINFOHEADER后面就是调色板信息,写对就行了。
关于调色板数据结构,MSDN上都有。

19,468

社区成员

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

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