您的位置:首页 > 其它

从GDI+的Bitmap对象得到设备无关位图句柄

2005-03-09 20:44 513 查看
HANDLE BitmapToDib(Bitmap* pBitmap)
{
    WORD             biBits;
    BITMAPINFOHEADER     bi;
    BITMAPINFOHEADER FAR *lpbi;
    DWORD                dwLen;
    HANDLE               hdib;
    HANDLE               h;
    HDC                  hdc;
    HPALETTE            hpal;

    if (!pBitmap)
        return NULL;

    PixelFormat format = pBitmap->GetPixelFormat();
    switch(format) {
    case PixelFormat1bppIndexed:
        biBits = 1;
        break;
    case PixelFormat4bppIndexed:
        biBits = 4;
        break;
    case PixelFormat8bppIndexed:
        biBits = 8;
        break;
    case PixelFormat24bppRGB:
        biBits = 24;
        break;
    case PixelFormat32bppRGB:
        biBits = 32;
        break;
    }

    bi.biSize               = sizeof(BITMAPINFOHEADER);
    bi.biWidth              = pBitmap->GetWidth();
    bi.biHeight             = pBitmap->GetHeight();
    bi.biPlanes             = 1;
    bi.biBitCount           = biBits;
    bi.biCompression        = 0;
    bi.biSizeImage          = 0;
    bi.biXPelsPerMeter      = 0;
    bi.biYPelsPerMeter      = 0;
    bi.biClrUsed            = 0;
    bi.biClrImportant       = 0;

    //Get Palette size
    UINT size = pBitmap->GetPaletteSize();
    
    ColorPalette* palette = (ColorPalette*)malloc(size);
    
    pBitmap->GetPalette(palette, size);

    //Get data size
    BitmapData bmd;
    pBitmap->LockBits(new Rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()),
        ImageLockModeRead, format, &bmd);

    bi.biSizeImage = bmd.Height * bmd.Stride;

    dwLen  = bi.biSize + palette->Count * sizeof(RGBQUAD) + bi.biSizeImage;

    hdib = GlobalAlloc(GHND,dwLen);

    lpbi = (BITMAPINFOHEADER FAR *)GlobalLock(hdib);
    *lpbi = bi;

    memcpy(lpbi, &bi, bi.biSize);

    RGBQUAD* pPal = (RGBQUAD*)((BYTE*)lpbi + bi.biSize);
//    pPal = (LOGPALETTE*)LocalAlloc(LPTR,sizeof(LOGPALETTE) + palette->Count * sizeof(PALETTEENTRY));
    
    if(size > 0)
    {
//        pPal->palNumEntries = palette->Count;
//        pPal->palVersion    = PALVERSION;
        
        for (int i = 0; i < palette->Count; i++){
            pPal[i].rgbRed   = GetRValue(palette->Entries[i]);
            pPal[i].rgbGreen = GetGValue(palette->Entries[i]);
            pPal[i].rgbBlue  = GetBValue(palette->Entries[i]);
            pPal[i].rgbReserved = (BYTE)0;
        }
//        hpal = CreatePalette(pPal);
//        LocalFree((HANDLE)pPal);
    }

//    PBYTE pdata = (PBYTE)(pPal + palette->Count * sizeof(RGBQUAD));
    PBYTE pdata = (PBYTE)lpbi + bi.biSize + palette->Count * sizeof(RGBQUAD);
    PBYTE pSrc = (PBYTE)bmd.Scan0;

    for (int r = bmd.Height - 2; r >= 0; r--)
    {
        memcpy(pdata, pSrc + r * bmd.Stride, bmd.Stride);
        pdata += bmd.Stride;
    }
//    memcpy(pdata, bmd.Scan0, bmd.Height * bmd.Stride);
    
    bi = *lpbi;
    GlobalUnlock(hdib);

    pBitmap->UnlockBits(&bmd);

    return hdib;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gdi+ bi byte null