我刚刚做了个8位位图的数据信息的函数,但是现实效果实在是令人看不下去。想从DDB转DIB这块下手,直接使用32或者24位的数据,不知道具体怎么填写位图信息头还有颜色数据怎么处理?
GetObject(pGdiNode->Gdi.hDIBitmap,sizeof(BITMAP),&(pGdiNode->Gdi.DIBitmap));
// 设置颜色模式
pGdiNode->Gdi.DIBitmap.bmBitsPixel = bmBitsPixel;//bmBitsPixel表示位数,初始位4位
// 初始化位图信息头
pGdiNode->Gdi.BMIH.biSize = sizeof(BITMAPINFOHEADER);
pGdiNode->Gdi.BMIH.biWidth = pGdiNode->Gdi.DIBitmap.bmWidth;
pGdiNode->Gdi.BMIH.biHeight = pGdiNode->Gdi.DIBitmap.bmHeight;
pGdiNode->Gdi.BMIH.biPlanes = 1;
pGdiNode->Gdi.BMIH.biBitCount = (WORD)pGdiNode->Gdi.DIBitmap.bmPlanes * (WORD)pGdiNode- >Gdi.DIBitmap.bmBitsPixel;     
pGdiNode->Gdi.BMIH.biCompression = BI_RGB;
pGdiNode->Gdi.BMIH.biSizeImage = 0;
pGdiNode->Gdi.BMIH.biXPelsPerMeter = 0;
pGdiNode->Gdi.BMIH.biYPelsPerMeter = 0;
pGdiNode->Gdi.BMIH.biClrUsed = 0;
pGdiNode->Gdi.BMIH.biClrImportant = 0; //设置区域的颜色数
pGdiNode->Gdi.nColors = 1 << pGdiNode->Gdi.BMIH.biBitCount;
//由于初始设置为4位,所以不能大于255色
//16,32位的都可以大于255
if (pGdiNode->Gdi.nColors > 256)
//加入超过8位就可以不要颜色表
pGdiNode->Gdi.nColors = 0; 
// 计算为位图信息头和彩色表分配内存所需的尺寸
pGdiNode->Gdi.dwLen = (DWORD)(sizeof(BITMAPINFOHEADER) + pGdiNode->Gdi.nColors * sizeof(RGBQUAD));

解决方案 »

  1.   

    这个帖子 - -
    BITMAPFILEHEADER * DDBToOLDDIB (HDC hdc, HBITMAP hBitmap,int BitCount)
    //BitCount取值1,4,8,24//返回值最后须free掉
    //把hBitmap转成DIB
    {
    BITMAP bm;
    int    iOffset, iSizeImage ;
    BYTE   *pBits;
    BITMAPFILEHEADER *pbfh;
    BITMAPCOREINFO *pbi;
    if(NULL==hBitmap)
    return NULL;
    GetObject(hBitmap,sizeof(BITMAP),&bm);
    switch(BitCount)
    {
    case 1:
    case 4:
    case 8:
    iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPCOREHEADER)+sizeof(RGBTRIPLE)*(1<<BitCount);
    break;
    case 24:
    iOffset=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPCOREHEADER);
    break;
    default:
    return NULL;
    }
    iSizeImage=(((bm.bmWidth*BitCount+31)/32)*4)*bm.bmHeight;
    pbfh=(BITMAPFILEHEADER *)malloc(iOffset+iSizeImage);
    if(NULL==pbfh)
    return NULL;
    pBits=(BYTE *)pbfh+iOffset;
    pbi=(BITMAPCOREINFO *)(pbfh+1);
    pbfh->bfType=0x4D42;
    pbfh->bfSize=iOffset+iSizeImage;
    pbfh->bfReserved1=0;
    pbfh->bfReserved2=0;
    pbfh->bfOffBits=iOffset; pbi->bmciHeader.bcSize=sizeof(BITMAPCOREHEADER);
    pbi->bmciHeader.bcWidth=(WORD)bm.bmWidth;
    pbi->bmciHeader.bcHeight=(WORD)bm.bmHeight;
    pbi->bmciHeader.bcPlanes=1;
    pbi->bmciHeader.bcBitCount=BitCount;
    GetDIBits(hdc,hBitmap,0,bm.bmHeight,pBits,(BITMAPINFO*)pbi,DIB_RGB_COLORS);
    return pbfh;
    }
    BITMAPFILEHEADER * pbmfh=DDBToOLDDIB(hdc,hBitmap,24);
    BYTE* pbit=(BYTE*)pbmfh+(pbmfh->bfOffBits);图素位指针
    //处理代码;
    free(pbmfh);