?
Solved

changing pixel depth in bitmaps

Posted on 1998-04-08
3
Medium Priority
?
613 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).
   
0
Comment
Question by:Sulaco
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
3 Comments
 
LVL 3

Expert Comment

by:byang
ID: 1317557
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.

0
 

Author Comment

by:Sulaco
ID: 1317558
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?

0
 
LVL 1

Accepted Solution

by:
JamieR earned 400 total points
ID: 1317559
First off, DIBs of more than 256 colours do not have palettes, they simply store the actual RGB data for each pixel, rather than an index. To dither to 8bits, create an 8bit DIB and then simply step through each pixel in the 16bit image, read the RGB value and then step though each entry in your 8bit palette until you find the nearest colour. Store this index in your corresponding 8bit image.

Windows has a (very poor) attempt at doing this automatically if you try to display a 16bit image under an 8bit driver, which is what you are seeing at the moment.

Jamie

0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This is to be the first in a series of articles demonstrating the development of a complete windows based application using the MFC classes.  I’ll try to keep each article focused on one (or a couple) of the tasks that one may meet.   Introductio…
Introduction: Displaying information on the statusbar.   Continuing from the third article about sudoku.   Open the project in visual studio. Status bar – let’s display the timestamp there.  We need to get the timestamp from the document s…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
Sometimes it takes a new vantage point, apart from our everyday security practices, to truly see our Active Directory (AD) vulnerabilities. We get used to implementing the same techniques and checking the same areas for a breach. This pattern can re…

719 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question