|
Would you mind helping me further? I loaded the bitmap, however when I check the values from the array into which the bitmap is loaded they show up as 0 (null).
modified 12-Mar-20 4:05am.
|
|
|
|
|
Really. And we are supposed to guess what code and where the error occurs?
|
|
|
|
|
here is my code
StringCchPrintfA(pszFilename,1024,"hello.bmp");
if( !cf.Open( pszFilename, CFile::modeRead ) )
{
StringCchPrintfA(message,1024,"error reading file");
MessageBox(NULL, message, "Textures.exe", MB_OK);
return( FALSE );
}
DWORD dwDibSize= cf.GetLength() - sizeof( BITMAPFILEHEADER );
int bsize =0;
bsize= cf.GetLength() - sizeof( BITMAPFILEHEADER );
StringCchPrintfA(message,1024,"bitmap size %d",bsize);
MessageBox(NULL, message, "Textures.exe", MB_OK);
unsigned char *pDib;
pDib = new unsigned char [dwDibSize];
if( pDib == NULL )
{
StringCchPrintfA(message,1024,"error allocating array ");
MessageBox(NULL, message, "Textures.exe", MB_OK);
return( FALSE );
}
BITMAPFILEHEADER BFH;
try{
if( cf.Read( &BFH, sizeof( BITMAPFILEHEADER ) )
!= sizeof( BITMAPFILEHEADER ) ||
BFH.bfType != 'MB' ||
cf.Read( pDib, dwDibSize ) != dwDibSize )
{
StringCchPrintfA(message,1024,"error processing the file ");
MessageBox(NULL, message, "Textures.exe", MB_OK);
delete [] pDib;
return( FALSE );
}
}
modified 12-Mar-20 8:41am.
|
|
|
|
|
And what is the problem and where does it occur?
And please use proper <pre> tags so your code is formatted properly. The code button at the top of the edit box provides proper formatting for most languages.
|
|
|
|
|
At the end of code posted above I try to do this:
StringCchPrintfA(message,1024,"dib at 34 %d",pDib[34]);
MessageBox(NULL, message, "Textures.exe", MB_OK);
I expect pDib[34] to be 255 since the bitmap is 10 white pixels ( in a row) 40 bytes in total.
|
|
|
|
|
|
yeah I was a bit in a hurry, I was expecting to find pixels right after the first header.
|
|
|
|
|
|
I was only using a part of the bitmap processing code I was using as reference. I don`t need the palette part so I trimmed out a bit too much.
m_pDib = pDib;
m_dwDibSize = dwDibSize;
m_pBIH = (BITMAPINFOHEADER *) m_pDib;
m_pPalette =
(RGBQUAD *) &m_pDib[sizeof(BITMAPINFOHEADER)];
m_width = m_pBIH->biWidth;
m_height = m_pBIH->biHeight;
m_nPaletteEntries = 1 << m_pBIH->biBitCount;
if( m_pBIH->biBitCount > 8 )
m_nPaletteEntries = 0;
else if( m_pBIH->biClrUsed != 0 )
m_nPaletteEntries = m_pBIH->biClrUsed;
m_pDibBits =
&m_pDib[sizeof(BITMAPINFOHEADER)+
m_nPaletteEntries*sizeof(RGBQUAD)];
if( m_Palette.GetSafeHandle() != NULL )
m_Palette.DeleteObject();
I know I must go past the bitmapinfoheader to get to the pixels
modified 13-Mar-20 14:06pm.
|
|
|
|
|
Please use proper <pre> tags around code blocks (and proper indentation), not Quoted text. The following code sample is preceded by
<pre lang="c++">
and followed by
</pre>
m_nPaletteEntries = 1 << m_pBIH->biBitCount;
if( m_pBIH->biBitCount > 8 )
m_nPaletteEntries = 0;
else if( m_pBIH->biClrUsed != 0 )
m_nPaletteEntries = m_pBIH->biClrUsed;
Much more readable.
|
|
|
|
|
I`m having trouble understanding how this code works. The problem is I`m not a c expert.
cf.Read( &BFH, sizeof( BITMAPFILEHEADER )
For instance how does the portion of data read from my file fits into a structure. It`s not a structure of identical items BITMAPFILEHEADER is a mix of WORDs and DWORDS
|
|
|
|
|
The sizeof operator gives the number of bytes in the object referred to. So in your case it will be the size of a BITMAPFILEHEADER , and the read operation will read the correct number of bytes into the structure. When complete each field of the structure should be correctly aligned*.
*There are conditions where this may not be true, so beware if you have a structure containing single byte elements. You may ignore that for the moment.
|
|
|
|
|
thanks that makes sense. In the code above do I need m_nPaletteEntries at all? Is used to calculate the offset at which individual pixels are stored?
|
|
|
|
|
|
I have to take a short break. Your insight (last post included) is priceless Richard, thanks
`DreamLand Page` is my projects facebook page.
|
|
|
|
|
Sorry to disappoint you, but my 'insight' is actually just a matter of reading the documentation.
|
|
|
|
|
the code you quoted is the bit that throws me into fog. What does the line that has the overload operator do?
|
|
|
|
|
fearless_ wrote: What does the line that has the overload operator do? What line?
|
|
|
|
|
m_nPaletteEntries = 1 << m_pBIH->biBitCount;
|
|
|
|
|
This is a bitwise left-shift operation which is equivalent to
m_nPaletteEntries = pow(2, m_pBIH->biBitCount); What are shift operators in C++?[^]
This trick is used quite often, since a bitwise shift operation is way quicker than the pow() method, which is rather intense on processing time.
Edit: here's an interesting list of useful bitwise tricks:
Bit Twiddling Hacks[^]
"Five fruits and vegetables a day? What a joke!
Personally, after the third watermelon, I'm full."
|
|
|
|
|
It's not pow, it's multiply by 2.
|
|
|
|
|
For a left-shift by a single bit, yes, a multiplication by 2.
But a left-shift by n bits, in the end, is the same as a multiplication by 2 to the power of n; since original value is 1, this leads to 2 to the power of n. Or am I missing something?
"Five fruits and vegetables a day? What a joke!
Personally, after the third watermelon, I'm full."
|
|
|
|
|
I found myself thinking about this when I woke up this morning and you are, of course, quite correct.
|
|
|
|
|
Richard I appreciate your willingness to help
|
|
|
|
|
fearless_ wrote: Would you mind helping me further? I loaded the bitmap, however when I check the values from the array into which the bitmap is loaded they show up as 0 (null).
1. How did you load the bitmap?
2. How did you "check the values from the array into which the bitmap is loaded"?
3. Did you try to open this bitmap with some graphic editor/viewer?
|
|
|
|