Changing a CBitmap's Palette

Environment: VC6 SP5

Sometimes, it is useful or at least desirable to use one bitmap and simply change its palette to achieve various graphical effects. Unfortunately, I have been unable to find any way to directly manipulate a CBitmap's palette information. What I have done in the function below is select the bitmap into a device context and manipulate the device context's color table. By applying the palette to the device context, you then can extract the bitmap with its new palette from the device context and reattach it to the original CBitmap object.

The function below takes two parameters: a CBitmap which contains a 4-bit-per-pixel or 8-bit-per-pixel (paletted) device-independent bitmap and a CPalette object that must have the same number of colors as the CBitmap object. After all, validation is performed in the first step to get the palette information from the CPalette object and put it into an array of RGBQUADs (that's how the DC expects it). Then, the bitmap is selected into a memory DC and the new palette is applied. Finally, the bitmap is extracted from the DC with the new palette information and reattached to the CBitmap object.

The function returns FALSE on failure and TRUE on success. Any memory that was dynamically allocated is cleaned up regardless of a failure to convert the bitmap's palette.

BOOL ApplyPaletteToBitmap(CBitmap &bitmap, CPalette &palette) {
   if (bitmap.m_hObject == NULL || palette.m_hObject == NULL)
      return FALSE;

   BITMAP bmp;
   bitmap.GetBitmap(&bmp);

   int npalColors = palette.GetEntryCount();

   // Bitmaps with 16 or 256 colors use palettes
   // Make sure the palette has enough entries for the bitmap
   // as well
   if ((bmp.bmBitsPixel != 4 && bmp.bmBitsPixel != 8) ||
       (bmp.bmBitsPixel == 4 && npalColors != 16) ||
       (bmp.bmBitsPixel == 8 && npalColors != 256))
      return FALSE;

   LPPALETTEENTRY pPalEntry = NULL;
   RGBQUAD *pRGB = NULL;
   BOOL ret = TRUE;

   try {
      // Create the palette
      pPalEntry = new PALETTEENTRY[npalColors];
      pRGB = new RGBQUAD[npalColors];

      palette.GetPaletteEntries(0, npalColors, pPalEntry);

      for (int i = 0; i < npalColors; i++) {
         pRGB[i].rgbRed   = pPalEntry[i].peRed;
         pRGB[i].rgbGreen = pPalEntry[i].peGreen;
         pRGB[i].rgbBlue  = pPalEntry[i].peBlue;
         pRGB[i].rgbReserved = 0;
      }

      CClientDC dc(NULL);
      CDC memDC;
      memDC.CreateCompatibleDC(&dc);
      memDC.SelectObject(&bitmap);

      SetDIBColorTable(memDC, 0, npalColors, pRGB);

      bitmap.Attach((HBITMAP)(memDC.GetCurrentBitmap()->Detach()));
   }
   catch (...) {
      ret = FALSE;
   }

   if (pPalEntry)
      delete [] pPalEntry;
   if (pRGB)
      delete [] pRGB;

   return ret;
}


Comments

  • CreateDIBSection

    Posted by Legacy on 07/02/2003 12:00am

    Originally posted by: hoan

    instead of do that, you create DIBSection bitmap and then do what you wan. You can set color table for this bitmap by SetDIBColorTable and you also modify direct bitmap data by the pointer to Bits returned by CreateDIBSection!

    Regards.

    Reply
  • yaaa

    Posted by Legacy on 02/24/2003 12:00am

    Originally posted by: prakash

    this is quite wonderful.
    i want more information on the reading of tiff format and processing it . how can i convert grey scale image to a RGB format? what is psudo coloring

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: March 19, 2015 @ 1:00 p.m. ET / 10:00 a.m. PT The 2015 Enterprise Mobile Application Survey asked 250 mobility professionals what their biggest mobile challenges are, how many employees they are equipping with mobile apps, and their methods for driving value with mobility. Join Dan Woods, Editor and CTO of CITO Research, and Alan Murray, SVP of Products at Apperian, as they break down the results of this survey and discuss how enterprises are using mobile application management and private …

  • Remember getting your first box of LEGOS as a kid? How fun it was putting the pieces together, collaborating with your friends to create something new? Now, as an IT professional, assembling and maintaining a Lego-like collaboration infrastructure isn't what you signed up for. Piecing together disparate systems of record for email, web meetings and other applications is about as painful as stepping on a pile of Legos. Download the e-book to learn how implementing a collaboration system connects systems of …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date