请求各个大哥教忙。先谢谢了。
我想用一个包含颜色信息的数组来创建一个DIB位图:
请各位大师帮我分析一下,看问题出在那里,郁闷了半个月了,就是搞不出来。
// 
unsigned char* pData=new unsigned char[576*768*3];
int y=0, x=0;
for(;y<576;y++)
for(;x<768;x++)
{
pData[x*3+y*768*3]=0;
pData[x*3+1+y*768*3]=0;
pData[x*3+2+y*768*3]=255;
}
//information headerBITMAPINFOHEADER FrameBmi;
FrameBmi.biSize=sizeof(BITMAPINFOHEADER);
FrameBmi.biPlanes=1;
FrameBmi.biCompression=BI_RGB;
FrameBmi.biClrImportant=0; 
FrameBmi.biSizeImage=768*576*3;
FrameBmi.biClrUsed=0;
FrameBmi.biBitCount=24;
FrameBmi.biWidth=768;
FrameBmi.biHeight=576;
FrameBmi.biXPelsPerMeter = 0;
FrameBmi.biYPelsPerMeter =0;
//file header
BITMAPFILEHEADER pf;
pf.bfType=0x4d42; //"BM"
pf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(char[768*576]); 
pf.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
pf.bfReserved1=0; 
pf.bfReserved2=0; //BITMAPINFOHEADER
LPBITMAPINFO lpbmi=(LPBITMAPINFO)GlobalAlloc(GMEM_FIXED,sizeof(BITMAPINFOHEADER));
ASSERT(lpbmi);
lpbmi->bmiHeader.biSize=FrameBmi.biSize;
lpbmi->bmiHeader.biPlanes=FrameBmi.biPlanes;
lpbmi->bmiHeader.biCompression=FrameBmi.biCompression;
lpbmi->bmiHeader.biClrImportant=FrameBmi.biClrImportant; 
lpbmi->bmiHeader.biSizeImage=FrameBmi.biSizeImage;
lpbmi->bmiHeader.biClrUsed=FrameBmi.biClrUsed;
lpbmi->bmiHeader.biBitCount=FrameBmi.biBitCount;
lpbmi->bmiHeader.biWidth=FrameBmi.biWidth;
lpbmi->bmiHeader.biHeight=FrameBmi.biHeight;
lpbmi->bmiHeader.biXPelsPerMeter=FrameBmi.biXPelsPerMeter;
lpbmi->bmiHeader.biYPelsPerMeter=FrameBmi.biYPelsPerMeter;
lpbmi->bmiColors=NULL;//创建DIB位图 
CBitmap *OldBitmap;
HBITMAP bmp =::CreateDIBitmap((HDC)pDC,&FrameBmi,CBM_INIT,pData,lpbmi, DIB_RGB_COLORS);
ASSERT(bmp);
//
CBitmap bitmap; 
bitmap.Attach(bmp);
CDC dcComp;
dcComp.CreateCompatibleDC(pDC);
OldBitmap=dcComp.SelectObject(&bitmap);
BITMAP bm;
bitmap.GetObject(sizeof(BITMAP),&bm);// draw bitmap
pDC->BitBlt(0,0,768,576,&dcComp,0,0,SRCCOPY);
dcComp.SelectObject(OldBitmap);
delete [] pData;
GlobalFree(lpbmi);

解决方案 »

  1.   

    int nWidth = 768, nHeight = 576;
    //BITMAPINFO
    LPBITMAPINFO lpbmi = new BITMAPINFO;
    ZeroMemory(lpbmi, sizeof(BITMAPINFO));
    lpbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    lpbmi->bmiHeader.biPlanes = 1;
    lpbmi->bmiHeader.biCompression = BI_RGB;
    lpbmi->bmiHeader.biClrImportant = 0; 
    lpbmi->bmiHeader.biSizeImage = 0;
    lpbmi->bmiHeader.biClrUsed = 0;
    lpbmi->bmiHeader.biBitCount = 24;
    lpbmi->bmiHeader.biWidth = nWidth;
    lpbmi->bmiHeader.biHeight = nHeight;
    lpbmi->bmiHeader.biXPelsPerMeter= 0;
    lpbmi->bmiHeader.biYPelsPerMeter= 0; //创建DIB位图 
    BYTE* pData;
    HBITMAP bmp = CreateDIBSection(NULL, lpbmi, DIB_RGB_COLORS, (void**)&pData, NULL, 0);
    ASSERT(bmp);
    if (!bmp)
    {
    GlobalFree(lpbmi);
    return;
    }
    int y = 0, x = 0;
    for(y = 0; y < nHeight; y++)
    {
    for(x = 0; x < nWidth; x++)
    {
    pData[x * 3 + y * nWidth * 3] = 0;
    pData[x * 3 + y * nWidth * 3 + 1] = 0;
    pData[x * 3 + y * nWidth * 3 +2] = 255;
    }
    }
    CDC dcComp;
    dcComp.CreateCompatibleDC(pDC);
    HBITMAP OldBitmap = (HBITMAP)dcComp.SelectObject(bmp); // draw bitmap
    pDC->BitBlt(0, 0, nWidth, nHeight, &dcComp, 0, 0, SRCCOPY); dcComp.SelectObject(OldBitmap);
    DeleteObject(bmp);
    DeleteDC(dcComp);
    delete lpbmi;除了创建DIB位图用CreateDIBSection函数之外,一些小错误要注意,GDI资源要释放;尤其是循环,良好的习惯是要给出初始条件的,你的循环没有初始条件,看看有什么结果。
      

  2.   

    果然利害,我试了一下,行了,太谢谢了。请问为什么不用CreateDIBitmap()而要用CreateDIBSection().