现在我大致明白如何设置BitmapInfoheader了,可是在创建一个Bitmap对象时出问题: pbitmap = Bitmap::FromBITMAPINFO(p_bmi,imagedata); 这个执行后发现pbitmap是空的,就是说FromBITMAPINFO返回了空指针,我自己新分配一块图像数据大小的内存块然后 
初始化为0,发现还是这样,所以推断应该是p_bmi的问题。p_bmi我是这样初始化的: m_pbmi = (BITMAPINFO*)malloc(sizeof(BITMAPINFO)); 
m_pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
m_pbmi->bmiHeader.biPlanes = 1; 
m_pbmi->bmiHeader.biBitCount = 24; 
m_pbmi->bmiHeader.biClrUsed = 0; 
m_pbmi->bmiHeader.biClrImportant = 0; 
m_pbmi->bmiHeader.biCompression = BI_RGB; 
m_pbmi->bmiHeader.biSizeImage = 0; 
m_pbmi->bmiHeader.biXPelsPerMeter = 0; 
m_pbmi->bmiHeader.biYPelsPerMeter = 0; 
// m_pbmi->bmiColors = NULL; 
m_pbmi->bmiColors[0].rgbBlue=0; 
m_pbmi->bmiColors[0].rgbGreen=0; 
m_pbmi->bmiColors[0].rgbRed=0; 
m_pbmi->bmiColors[0].rgbReserved=0; 
不知道是不是有问题,很多文章里提到说biBitcount=24时,bmiColors应该为空,怎么设置为空呢?还是说我其他的设置有错?请有经验的人指点一下!

解决方案 »

  1.   

    bmiColors是一个数组,储存调色板,256色以下的位图才需要,数组长度就是颜色数,为“空”就是数组长度为0,即没有这个数组的储存空间。
      

  2.   

    把有关bmiColors的代码都去掉。
      

  3.   

    m_pbmi->bmiHeader.biSizeImage = 0; 
    就是说没有图像数据了还有你没有设置图像的宽高;这样当然不能创建图像了
      

  4.   

    BITMAPINFOHEADER bmih = { 0 };   
    int nBytesPerLine = ((m_nWidth * 32 + 31) & (~31)) >> 3;
    // Populate BITMAPINFO header   
    bmih.biSize = sizeof(BITMAPINFOHEADER);   
    bmih.biWidth = m_nWidth;   
    bmih.biHeight = m_nHeigh;   
    bmih.biPlanes = 1;   
    bmih.biBitCount = 32;   
    bmih.biCompression = BI_RGB;   
    bmih.biClrUsed = 0;   
    bmih.biSizeImage = nBytesPerLine * m_nHeigh;    PVOID pvBits = NULL;   
    HBITMAP hbmpMem = ::CreateDIBSection(NULL, (PBITMAPINFO)&bmih, DIB_RGB_COLORS, &pvBits, NULL, 0);
    ASSERT(hbmpMem != NULL);
    memset( pvBits, 0, m_nWidth * 4 * m_nHeigh);
      

  5.   

    赋值为0,就是设置为空!
    其它问题,由于FromBITMAPINFO的内部不知道啊
      

  6.   

    我试了下不给bmicolors分配空间,可还是不行……
      

  7.   

    试过了,把关于bmicolors的代码去掉还是不行,然后我的图像的宽高是在后面指定的,并不是没有,这里应该不会有错。我查mSDN上面说对于BI_RGB来说biSizeImage可以设置为零,而且我试了下就算设置成图像数据的大小也还是不行。
      

  8.   

    回复4楼:我现在得到的图像数据是每3Byte一个pixel,应该把biBitcount设置为24,你设置成32不行吧?
      

  9.   

    VOID Example_Bitmap(Graphics& graphics)
    {
    BITMAPINFO bmi = {0};
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biBitCount = 24;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biWidth = 101;
    bmi.bmiHeader.biHeight = 102;
    bmi.bmiHeader.biCompression = BI_RGB;
    int nPixelBytes = bmi.bmiHeader.biBitCount / 8;
    if (nPixelBytes * 8 != bmi.bmiHeader.biBitCount)
    return;
    int nWidthBytes = ((bmi.bmiHeader.biWidth * nPixelBytes) / 4  + 1) * 4;
    int nSize = nWidthBytes * bmi.bmiHeader.biHeight;
    LPBYTE pBmpData = new BYTE[nSize];
    if (!pBmpData)
    return;
    for (int i = 0; i < nSize; i++)
    pBmpData[i] = rand() % 255;
    Bitmap* pBmp = Bitmap::FromBITMAPINFO(&bmi, pBmpData);
    if (pBmp)
    {
    graphics.DrawImage(pBmp, 10, 10);
    }
    delete[] pBmpData;
    }
      

  10.   

    为什么我把实例的代码整个拷过去,修改成自己希望的320*240的图像大小,然后用自己的Graphics显示,发现Bitmap::FromBITMAPINFO()返回的还是0x00000000,怎么会这样呢?!
      

  11.   

        修改后的代码,基本上就是照搬那个例子的……    BITMAPINFO bmi = {0};
        bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        bmi.bmiHeader.biBitCount = 24;
        bmi.bmiHeader.biPlanes = 1;
        bmi.bmiHeader.biWidth = 320;
        bmi.bmiHeader.biHeight = 240;
        bmi.bmiHeader.biCompression = BI_RGB;
        int nPixelBytes = bmi.bmiHeader.biBitCount / 8;
        if (nPixelBytes * 8 != bmi.bmiHeader.biBitCount)
            return;
        int nWidthBytes = ((bmi.bmiHeader.biWidth * nPixelBytes) / 4  + 1) * 4;
        int nSize = nWidthBytes * bmi.bmiHeader.biHeight;
        LPBYTE pBmpData = new BYTE[nSize];
        if (!pBmpData)
            return;
        for (int i = 0; i < nSize; i++)
            pBmpData[i] = rand() % 255;
        Bitmap* pBmp = Bitmap::FromBITMAPINFO(&bmi, pBmpData);然后就看到pBmp是空的,0x00000000.不明白是怎么回事。
      

  12.   

    确实是 GDI+ 的初始化问题,多谢各位 ,尤其感谢Machz!
      

  13.   


        bmiColors数组只有一个数据成员,它是怎么存贮的呢?