We help IT Professionals succeed at work.

changing pixel depth in bitmaps

Sulaco
Sulaco asked
on
640 Views
Last Modified: 2013-11-20
The problem is that when I'm in 16-bit+ color modes and I want to create a bitmap that has a color format of 8 bits per pixel, the bitmap created is drawn with colors that I do not want.  The way i create an 8 bit per pixel bitmap is to first create a bitmap in the current color mode i am in, then I use GetDibits to transform the bitmap into an 8 bits per pixel bitmap.  However, the documentation for GetDibits says that when it does this transformation, it will synthesize its own color table from a general mix of 256 colors including the 20 static colors defined in the default logical palette.  This is clearly NOT the color table i want.  I want the 8 bits per pixel bitmap to use the same colors as the original bitmap was drawn in.  (The original bitmap is definitely not drawn with more than 256 colors - it's drawn with just like 20 different colors.) The bitmap is a picture of the view within my application.

I've also thought of BitBltting from a 16+ bit bitmap to an 8-bit bitmap, but that means I have to create an 8-bit bitmap and select it into my destination device context.  The documentation says that when i do a SelectObject for a bitmap, the bitmap color format must be the same as the device context color format.  And, I am not sure how to create a device context that is in an 8-bit color format when my system is  in a 16-bit+ color mode.  How do i do this?
 
In short, when I am in 16-bit+ color resolution modes, I want to create an 8 bits per pixel bitmap (of my current view) that uses a 256 color palette that i specify.  How do i do this?  Thanks for your response(s).
   
Comment
Watch Question

Commented:
Setup a BITMAPINFO structure, make it 8-bit, and put your palette RGB values in bmiColors field. Then use
CreateDIBSection(NULL,(BITMAPINFO*)pbmi,DIB_RGB_COLORS, &pvBits, NULL,0) to create the bitmap, it returns you an HBITMAP handle. Then load your bitmap into buffer pointed by pvBits. Use SetDIBitsToDevice() to draw it.

Author

Commented:
Well, first, i don't want to draw the 8 BPP bitmap.  I want to save it out to a file.  (So, I don't need to use SetDibitsToDevice, right?)  Second, I still don't understand how loading my 16+ BPP bitmap data into the buffer pointed to by pvBits will create a 8 BPP bitmap for me.  The original bitmap i have created is in 16+ BPP.  If i simply loaded this data into the buffer pointed to by pvBits, it won't change the color format from 16+ BPP to 8 BPP, will it?

Commented:
This one is on us!
(Get your first solution completely free - no credit card required)
UNLOCK SOLUTION

Gain unlimited access to on-demand training courses with an Experts Exchange subscription.

Get Access
Why Experts Exchange?

Experts Exchange always has the answer, or at the least points me in the correct direction! It is like having another employee that is extremely experienced.

Jim Murphy
Programmer at Smart IT Solutions

When asked, what has been your best career decision?

Deciding to stick with EE.

Mohamed Asif
Technical Department Head

Being involved with EE helped me to grow personally and professionally.

Carl Webster
CTP, Sr Infrastructure Consultant
Empower Your Career
Did You Know?

We've partnered with two important charities to provide clean water and computer science education to those who need it most. READ MORE

Ask ANY Question

Connect with Certified Experts to gain insight and support on specific technology challenges including:

  • Troubleshooting
  • Research
  • Professional Opinions
Unlock the solution to this question.
Join our community and discover your potential

Experts Exchange is the only place where you can interact directly with leading experts in the technology field. Become a member today and access the collective knowledge of thousands of technology experts.

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.