Jump to content

  • Log In with Google      Sign In   
  • Create Account

need help - BEGINNER


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 Theses   Members   -  Reputation: 122

Like
Likes
Like

Posted 26 November 1999 - 05:57 AM

i have this annoying problem with bitmaps
apparently i can load bitmaps with any height
however apparently if the bitmap has a width of some odd number like 599 it fucks up bad.
i know i'm not explaining much about this code. its really weird when i change the width of the image i'm trying to display from 599 to 600 everything works just fine


for (int index_y = 0; index_y < bitmap.bitmapinfoheader.biHeight; index_y++)
{
for (int index_x = 0; index_x < bitmap.bitmapinfoheader.biWidth; index_x++)
{
UCHAR blue = (bitmap.buffer[index_y * bitmap.bitmapinfoheader.biWidth * 3 + index_x * 3 + 0]),
green = (bitmap.buffer[index_y * bitmap.bitmapinfoheader.biWidth * 3 + index_x * 3 + 1]),
red = (bitmap.buffer[index_y * bitmap.bitmapinfoheader.biWidth * 3 + index_x * 3 + 2]);

UINT pixel = _RGB32BIT(0, red, green, blue);

back_buffer[(index_y * ddsd.lPitch >> 2) + index_x] = pixel;
}
}

[This message has been edited by Theses (edited November 26, 1999).]

[This message has been edited by Theses (edited November 26, 1999).]


Sponsor:

#2 ghowland   Members   -  Reputation: 134

Like
Likes
Like

Posted 25 November 1999 - 08:46 PM

Is there any reason you are using the pitch instead of the index_x in the final back_buffer placement?

You may want to () around the pitch shift.

Another odd thing, though it shouldnt be a problem, is that blue is defined in the loop while they others arent. Strictly syntax if they are both UCHARs still.

I dont see anything inherently wrong with the logic though.

-Geoff


#3 foofightr   Members   -  Reputation: 130

Like
Likes
Like

Posted 26 November 1999 - 05:57 AM

Theses, the BMP file format aligns widths to 4. So your bitmap with 599 pixels wide is actually stored as 600 pixels (599 real, 1 padding) per line. So you have to write code to check for and compensate for this. This usually works:

int width_padding = ((width+3) & ~3) - width;

(What this line does is temporarily round the width up to the next multiple of 4, then subtracts it from the actual width. So, 599 temporarily becomes 600, and 600 - 599 = 1, so you have 1 byte of padding per scanline)

Every scanline has this many pixels of padding.

As a reminder, For 24bit bitmaps, every pixel padded adds 3 bytes, so don't forget this

BTW Microsoft should recall the BMP format, too many people are getting this problem.. I must have answered this same question a dozen times just on this board alone





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS