bmp文件中有一部分是调色盘的信息,可以将这部分信息得到,改变颜色顺序,就变成了PaletteEntries ,再通过CPalette::SetPaletteEntries

解决方案 »

  1.   

    I write CMightyBitmap to wrap many functionalities!
      

  2.   

    看我的例子:#define DSPDxax   0x00E20746SwapBitmapColor(CDC* pDC, CBitmap* pBitmap,COLORREF rgbNew, COLORREF rgbOld)
    {
         BITMAP bm;
         CBitmap bmMask;
         CDC memDC,maskDC;
        
         // create memory dc for drawing
         memDC.CreateCompatibleDC( pDC );
         CPalette* pOldPalette = (CPalette*)memDC.SelectPalette(
                        pDC->GetCurrentPalette(),FALSE);
         memDC.RealizePalette();
         CBitmap* Bitmap = memDC.SelectObject( pBitmap );     // fill out bitmap structure
         pBitmap->GetBitmap( &bm );     // create mask
         bmMask.CreateBitmap( bm.bmWidth,bm.bmHeight,1,1,NULL );     maskDC.CreateCompatibleDC( &memDC );
         CBitmap* bmOld = maskDC.SelectObject( &bmMask );     CBrush brush( rgbNew );
         CBrush* brOld = (CBrush*)memDC.SelectObject( &brush );     memDC.SetBkColor( rgbOld );
         maskDC.BitBlt( 0,0,bm.bmWidth,bm.bmHeight,&memDC,0,0,SRCCOPY );     memDC.SetBkColor( RGB(255,255,255) );
         memDC.SetTextColor( RGB(0,0,0) );
         memDC.BitBlt( 0,0,bm.bmWidth,bm.bmHeight,&maskDC,0,0,DSPDxax );     maskDC.SelectObject( bmOld );
         memDC.SelectObject( &brOld );
         memDC.SelectObject( Bitmap );
         memDC.SelectPalette( pOldPalette,FALSE );
      

  3.   

    FireAngel:用你的方法只能得到系统调色盘,我在资源中加入256色位图,得到的不是256色调色盘,而是24bit的调色盘,与windows设定一样。如何得到它的调色盘?
      

  4.   

    24bits没有调色板吧。。呵呵。。
    这个是我写的一个Functon, 你看看吧。。
    #define WIDTHBYTES(bits)    (((bits) + 31) / 32 * 4)HBITMAP LoadBitmap(TCHAR szFileName[], LOGPALETTE** pPal)
    {
    //open file;
    HFILE hf = _lopen(szFileName, OF_READ);
    if( hf == NULL )
    return NULL; BITMAPFILEHEADER bmfh;
    BITMAPINFOHEADER bmih; _lread(hf, &bmfh, sizeof(BITMAPFILEHEADER));
    _lread(hf, &bmih, sizeof(BITMAPINFOHEADER)); _llseek(hf, sizeof(BITMAPFILEHEADER), FILE_BEGIN);

    int iSize = bmfh.bfSize - sizeof(BITMAPFILEHEADER);
    char* pImg = new char[iSize]; _lread(hf, pImg, iSize);
    _lclose(hf); //if the type is not 'BM'
    if( bmfh.bfType != 0x4d42 )
    return NULL; //check the size;
    int iLnWid = WIDTHBYTES(bmih.biBitCount * bmih.biWidth);
    if( bmih.biSizeImage != iLnWid * bmih.biHeight )
    return NULL;
    int iClrNo = 0;
    RGBQUAD* pRgb = NULL; if( bmih.biClrUsed != 0 )
    iClrNo = bmih.biClrUsed;
    else
    {
    switch( bmih.biBitCount )
    {
    case 1:
    iClrNo = 2;
    break; case 4:
    iClrNo = 16;
    break; case 8:
    iClrNo = 256;
    break; default:
    iClrNo = 0;
    }
    }
    HPALETTE hPal = NULL;
    if( iClrNo != 0 )
    {
    pRgb = (RGBQUAD*)(pImg + sizeof(BITMAPINFOHEADER)); *pPal = (LOGPALETTE*)new char[sizeof(LOGPALETTE) + 
    iClrNo * sizeof(RGBQUAD)]; (*pPal)->palVersion = 0x300;
    (*pPal)->palNumEntries = iClrNo; for( int i = 0; i < iClrNo; i++ )
    {
    (*pPal)->palPalEntry[i].peRed = pRgb->rgbRed;
    (*pPal)->palPalEntry[i].peGreen = pRgb->rgbGreen;
    (*pPal)->palPalEntry[i].peBlue = pRgb->rgbBlue;
    (*pPal)->palPalEntry[i].peFlags = 0;
    } hPal = CreatePalette((*pPal));
    }
    HDC hdc = GetDC(NULL);
    if( hPal != NULL )
    {
    SelectPalette(hdc, hPal, false);
    RealizePalette(hdc);
    } HBITMAP hBmp = CreateDIBitmap(hdc, (BITMAPINFOHEADER*)pImg, CBM_INIT, 
    (void*)(pImg + sizeof(BITMAPINFOHEADER) + iClrNo * sizeof(RGBQUAD)),
    (BITMAPINFO*)pImg, DIB_RGB_COLORS); BITMAP bm;
    GetObject(hBmp, sizeof(BITMAP), &bm); ReleaseDC(NULL, hdc); if( hPal != NULL )
    DeleteObject(hPal); delete []pImg;
    return hBmp;
    }