Sign in to follow this  

I need some help setting up and modifying a 32-bit bitmap in Windows[solved]

This topic is 2877 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I have absolutely no experience with bitmaps under Windows. The last time I did anything with bitmaps, I was using 8-bit bitmaps on Mac OS 7. Things are just a tiny bit different. I've looked through MSDN and have done plenty of Google searches, but most of what I am finding is strictly 8-bit code examples. I'm making a software rasterizer. Currently, I'm cheating and setting pixels via an orthographic projection and GL_POINTS. Obviously not optimal. Laughable, really. How do I set up a 32-bit bitmap and set individual pixels? I found some code that sort of works, using CreateDIBSection, but for some reason the bitmap is always displayed in blue. I have a choice of black, white and shades of blue. Here is the set up code I'm using:
	ZeroMemory(&RGB32BitsBITMAPINFO,sizeof(BITMAPINFO));
	RGB32BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	RGB32BitsBITMAPINFO.bmiHeader.biWidth = 800;
	RGB32BitsBITMAPINFO.bmiHeader.biHeight = -800;
	RGB32BitsBITMAPINFO.bmiHeader.biPlanes = 1;
	RGB32BitsBITMAPINFO.bmiHeader.biBitCount = 32;
	RGB32BitsBITMAPINFO.bmiHeader.biCompression = BI_RGB;

	offscreenDC = CreateCompatibleDC(NULL);
	offscreen = CreateDIBSection(offscreenDC,(BITMAPINFO *)&RGB32BitsBITMAPINFO,DIB_RGB_COLORS,(void **)&ptPixels,NULL,0);
	if(!offscreen)
		return(false);
	SelectObject(offscreenDC,offscreen);


To set pixels, I'm doing: ptPixels[offset] = (long)pixel_color; Where: offset = ((y * height) + x) * 4); No matter the value of pixel_color, I get black, white or shades of blue. What am I doing wrong? Does anyone have a link to a tutorial or some code I could see? [Edited by - maspeir on March 3, 2010 12:40:57 PM]

Share this post


Link to post
Share on other sites
Here is a neat little class that you can use to "render" to a windows bitmap. It comes with a sample application that uses it to continually generate some image and display it to a window. The class also supports saving the image to file. If you have any questions about it, feel free to ask.
http://my.opera.com/adelamro/blog/gdi-memory-bitmap Sorry I'm linking to the blog post since hot linking is not allowed on my.opera.

Share this post


Link to post
Share on other sites
Thank you. I'll take a look at that, but I solved it on my own. I was writing this code at about 1 AM. Tired minds don't write very good code.

Anyway, this works:


buffer = &ptPixels[(y * 800) + x];
...snip...
offset = ((tv * 256) + tu) * 4; // Texture access
tr = (unsigned char)tex->imageData[offset];
tg = (unsigned char)tex->imageData[offset + 1];
tb = (unsigned char)tex->imageData[offset + 2];

*buffer = (tr << 16) | (tg << 8) | tb;
...snip...





[edit]

Thank you again for that link! Your code will provide me with good reference material.

Share this post


Link to post
Share on other sites
Quote:
but I solved it on my own

Surprisingly, I find that.... disappointing >_<'
I wonder if it's just me or it's a global thing..

[EDIT]Ah, I feel much better now :D

Share this post


Link to post
Share on other sites
Quote:
Original post by Amr0
Quote:
but I solved it on my own

Surprisingly, I find that.... disappointing >_<'


Don't be! Your code will provide me with quite a bit of direction. I didn't want someone else to solve this for me, but I couldn't figure it out last night. As is typical with me, I'll make a post asking for help, and then while waiting for a reply, solve the problem myself. For some reason, merely asking the question gives me the answer.

Share this post


Link to post
Share on other sites
Sign in to follow this