我想把由CCD采集到内存中的数据以BMP图像的形式显示出来,要以8位灰度图显示出来,可是不知道调色板以及信息头怎么设置,请大侠们指点一下,我把部分代码写出来:
     图像存放在pImageBuffer的缓冲区中,大小为ImageHeight*ImageWidth;
之前调色板设置如下:
     m_pRGBQUAD = new RGBQUAD[256];
m_pGreyBMI = NULL;
m_pGreyBMI = (BITMAPINFO*)(new BYTE[sizeof(BITMAPINFOHEADER)+256*4]);
m_pGreyBMI->bmiHeader.biSize = sizeof(BITMAPINFOHEADER)+256*4;
m_pGreyBMI->bmiHeader.biBitCount = 8;
m_pGreyBMI->bmiHeader.biClrUsed = 256;//设置调色板
RGBQUAD greyScale[256];
for(int i=0; i<256; i++)
{
greyScale[i].rgbRed = i;
greyScale[i].rgbGreen = i;
greyScale[i].rgbBlue = i;
greyScale[i].rgbReserved = 0;
}
memcpy(m_pGreyBMI->bmiColors, greyScale, sizeof(RGBQUAD)*256);pLogPal = NULL;
pLogPal = (LOGPALETTE*)(new BYTE[sizeof(LOGPALETTE)+256*sizeof(PALETTEENTRY)]);
pLogPal->palNumEntries = 256;
pLogPal->palVersion = 0x300;
for(i=0; i<256; i++)
{
pLogPal->palPalEntry[i].peRed = i;
pLogPal->palPalEntry[i].peGreen = i;
pLogPal->palPalEntry[i].peBlue = i;
pLogPal->palPalEntry[i].peFlags = 0;
}
显示;
StretchDIBits(pDC->GetSafeHdc(),
0,
0,
ImageWidth,//显示窗口宽度
ImageHeight,//显示窗口高度
0,
0,
ImageWidth,//图像宽度
ImageHeight,//图像高度
pImageBuffer,//图像缓冲区
m_pGreyBMI,//BMP图像描述信息
DIB_RGB_COLORS,
SRCCOPY
);
不知道为什么没有办法显示,估计是信息头设置的不对,那位大虾能帮忙改一下 不胜感激

解决方案 »

  1.   

    位图文件读写综述http://www.vckbase.com/document/viewdoc/?id=674
      

  2.   

    我只能帮up一下了,我也是刚学VC++
      

  3.   

    m_pBih->biSize = sizeof(BITMAPINFOHEADER);
    m_pBih->biHeight = lHeight;
    m_pBih->biWidth = lWidth;
    m_pBih->biPlanes = 1;
    m_pBih->biBitCount = 8;
    m_pBih->biCompression = BI_RGB;
    m_pBih->biSizeImage = m_dwSize;
    m_pBih->biXPelsPerMeter = 0x0ec4;
    m_pBih->biYPelsPerMeter = 0x0ec4;
    m_pBih->biClrUsed = 0;
    m_pBih->biClrImportant = 0;
      

  4.   

    说点题外的,LZ可以考虑用OPENCV的库,读取视频流可以用CVCAPTUREFROMCAM()读取,显示可以用CVSHOWIMAGE()显示,对图像位进行操作可以通过定义一个宏来完成
      

  5.   

    其实CImage也是基于Windows那几个API写的,如果功能不太复杂,倒也无所谓