急求:怎样构建256色位图??

RobJack 2009-05-21 04:17:06
BYTE *m_pDib; // 指向设备无关位图的指针
BYTE *m_pBits; // 像素数据的指针

读入的24位真彩位图转变为256色位图后怎样构建新图像?即:
读入的图像为24色真彩位图,根据它的像素数据指针m_pBits读取像素数据,根据规则0.299R + 0.587G + 0.114B转换成相应的256色位图存到数组a中,
if( m_pDib != NULL )
delete [] m_pDib;
m_pDib = new BYTE [40L + 256 * 4 + ( ( wid * 8 ) / 32 * 4 ) * hei];

但是怎样填充m_pDib这个指针啊?
转换后的256色像素数据可以从m_pDib[40+256*4]开始填,
但是前面的40+256*1024这块空间具体填什么内容啊??
...全文
394 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
biweilun 2009-05-21
  • 打赏
  • 举报
回复
需要填充一个BITMAPINFOHEADER
lambochan 2009-05-21
  • 打赏
  • 举报
回复
很简单,正确填上BITMAPINFO就行..就象下面的:

LPBITMAPINFOHEADER lpBmih = ( LPBITMAPINFOHEADER )m_pDib;
memset( lpBmih, 0x0, sizeof( BITMAPINFOHEADER ) );
lpBmih->biSize = sizeof( BITMAPINFOHEADER );
lpBmih->biBitCount = 8;
lpBmih->biWidth = wid;
lpBmih->biHeight = hei;
lpBmih->biPlanes = 1;
lpBmih->biCompression = BI_RGB;

LPRGBQUAD lpRGB = ( LPRGBQUAD )( m_pDib + sizeof( BITMAPINFOHEADER ) );
for( int i = 0; i < 256; ++i ){
lpRGB[i].rgbRed = lpRGB[i].rgbGreen = lpRGB[i].rgbBlue = i;
lpRGB[i].rgbReserved = 0;
}

那么就已经构造好这个256色灰度图的BITMAPINFO..

zhangyan_wt 2009-05-21
  • 打赏
  • 举报
回复
看样子是要灰度图象,前40字节是一个BITMAPINFOHEADER
中间1024是调色板,RGBQUAD[256],RGB分别都赋成从0到255,就是说
RGBQUAD colortable[256];
for(i =0; i < 256; i++)
{
colortable[i].rgbBlue = colortable[i].rgbGreen = colortable[i].rgbRed = i;
colortable[i].rgbReserved = 255;
}
RobJack 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yayafu 的回复:]
看看位图格式,256色位图要颜色表,不需要0.299R + 0.587G + 0.114B
[/Quote]

初次接触图像编程,我做的功能编程时是针对256色位图的,所以当读到24位真彩位图时我要先把它转成256色位图,图像数据部分已经转好了,问题是怎样重新构建m_pDib这个指针呢?即前面的40+256*4位具体填何值?网上查了一下,前40位是位图头信息,我可以根据位图的宽高等数据填进去,问题调色板具体填什么,没找到具体答案
yayafu 2009-05-21
  • 打赏
  • 举报
回复
看看位图格式,256色位图要颜色表,不需要0.299R + 0.587G + 0.114B

19,464

社区成员

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

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