Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. c libraries needed to deal with bitmaps

c libraries needed to deal with bitmaps

Scheduled Pinned Locked Moved C / C++ / MFC
c++helpquestion
32 Posts 5 Posters 1 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • V Victor Nijegorodov

    leon de boer wrote:

    One line of code will load it for you and it doesn't care what the bitmap format is.

    HBITMAP MyBmp = LoadBitmap(0, "Yourbitmapname.bmp");

    You probaly meant the [LoadImageA function (winuser.h) - Win32 apps | Microsoft Docs](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-loadimagea) function that can load the bitmap from the file. LoadBitmap only loads the bitmap from resources.

    L Offline
    L Offline
    leon de boer
    wrote on last edited by
    #17

    Yep sorry needed more coffee last night, clearly :-)

    In vino veritas

    1 Reply Last reply
    0
    • L Lost User

      It is all explained at Bitmap Header Types - Win32 apps | Microsoft Docs[^]. But take special care of the different header types that may exist.

      C Offline
      C Offline
      Calin Negru
      wrote on last edited by
      #18

      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;

      // Pointer our BITMAPINFOHEADER and RGBQUAD
      // variables to the correct place in the Dib data.
      m\_pBIH = (BITMAPINFOHEADER \*) m\_pDib;
      m\_pPalette =
      	(RGBQUAD \*) &m\_pDib\[sizeof(BITMAPINFOHEADER)\];
      
      //	get image width and height
      m\_width = m\_pBIH->biWidth;
      m\_height = m\_pBIH->biHeight;
      
      // Calculate the number of palette entries.
      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;
      
      // Point m\_pDibBits to the actual Dib bits data.
      m\_pDibBits =
      	&m\_pDib\[sizeof(BITMAPINFOHEADER)+
      		m\_nPaletteEntries\*sizeof(RGBQUAD)\];
      
      // If we have a valid palette, delete it.
      if( m\_Palette.GetSafeHandle() != NULL )
      	m\_Palette.DeleteObject();
      

      I know I must go past the bitmapinfoheader to get to the pixels

      L 1 Reply Last reply
      0
      • C Calin Negru

        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;

        // Pointer our BITMAPINFOHEADER and RGBQUAD
        // variables to the correct place in the Dib data.
        m\_pBIH = (BITMAPINFOHEADER \*) m\_pDib;
        m\_pPalette =
        	(RGBQUAD \*) &m\_pDib\[sizeof(BITMAPINFOHEADER)\];
        
        //	get image width and height
        m\_width = m\_pBIH->biWidth;
        m\_height = m\_pBIH->biHeight;
        
        // Calculate the number of palette entries.
        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;
        
        // Point m\_pDibBits to the actual Dib bits data.
        m\_pDibBits =
        	&m\_pDib\[sizeof(BITMAPINFOHEADER)+
        		m\_nPaletteEntries\*sizeof(RGBQUAD)\];
        
        // If we have a valid palette, delete it.
        if( m\_Palette.GetSafeHandle() != NULL )
        	m\_Palette.DeleteObject();
        

        I know I must go past the bitmapinfoheader to get to the pixels

        L Offline
        L Offline
        Lost User
        wrote on last edited by
        #19

        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>

        // Calculate the number of palette entries.
        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.

        C 1 Reply Last reply
        0
        • L Lost User

          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>

          // Calculate the number of palette entries.
          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.

          C Offline
          C Offline
          Calin Negru
          wrote on last edited by
          #20

          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

          L 1 Reply Last reply
          0
          • C Calin Negru

            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

            L Offline
            L Offline
            Lost User
            wrote on last edited by
            #21

            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.

            C 1 Reply Last reply
            0
            • L Lost User

              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.

              C Offline
              C Offline
              Calin Negru
              wrote on last edited by
              #22

              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?

              L 1 Reply Last reply
              0
              • C Calin Negru

                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?

                L Offline
                L Offline
                Lost User
                wrote on last edited by
                #23

                You need to examine the different items in the info table as described at BITMAPINFOHEADER structure (Windows) | Microsoft Docs[^]. The values of the items related to colours will tell you whether a colour table is included or not.

                C 1 Reply Last reply
                0
                • L Lost User

                  You need to examine the different items in the info table as described at BITMAPINFOHEADER structure (Windows) | Microsoft Docs[^]. The values of the items related to colours will tell you whether a colour table is included or not.

                  C Offline
                  C Offline
                  Calin Negru
                  wrote on last edited by
                  #24

                  I have to take a short break. Your insight (last post included) is priceless Richard, thanks

                  `DreamLand Page` is my projects facebook page.

                  L 1 Reply Last reply
                  0
                  • C Calin Negru

                    I have to take a short break. Your insight (last post included) is priceless Richard, thanks

                    `DreamLand Page` is my projects facebook page.

                    L Offline
                    L Offline
                    Lost User
                    wrote on last edited by
                    #25

                    Sorry to disappoint you, but my 'insight' is actually just a matter of reading the documentation.

                    C 1 Reply Last reply
                    0
                    • L Lost User

                      Sorry to disappoint you, but my 'insight' is actually just a matter of reading the documentation.

                      C Offline
                      C Offline
                      Calin Negru
                      wrote on last edited by
                      #26

                      the code you quoted is the bit that throws me into fog. What does the line that has the overload operator do?

                      L 1 Reply Last reply
                      0
                      • C Calin Negru

                        the code you quoted is the bit that throws me into fog. What does the line that has the overload operator do?

                        L Offline
                        L Offline
                        Lost User
                        wrote on last edited by
                        #27

                        fearless_ wrote:

                        What does the line that has the overload operator do?

                        What line?

                        C 1 Reply Last reply
                        0
                        • L Lost User

                          fearless_ wrote:

                          What does the line that has the overload operator do?

                          What line?

                          C Offline
                          C Offline
                          Calin Negru
                          wrote on last edited by
                          #28

                          m_nPaletteEntries = 1 << m_pBIH->biBitCount;

                          P 1 Reply Last reply
                          0
                          • C Calin Negru

                            m_nPaletteEntries = 1 << m_pBIH->biBitCount;

                            P Offline
                            P Offline
                            phil o
                            wrote on last edited by
                            #29

                            This is a bitwise left-shift operation which is equivalent to

                            m_nPaletteEntries = pow(2, m_pBIH->biBitCount); // 2 to the power of bpp

                            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."

                            L 1 Reply Last reply
                            0
                            • P phil o

                              This is a bitwise left-shift operation which is equivalent to

                              m_nPaletteEntries = pow(2, m_pBIH->biBitCount); // 2 to the power of bpp

                              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."

                              L Offline
                              L Offline
                              Lost User
                              wrote on last edited by
                              #30

                              It's not pow, it's multiply by 2.

                              P 1 Reply Last reply
                              0
                              • L Lost User

                                It's not pow, it's multiply by 2.

                                P Offline
                                P Offline
                                phil o
                                wrote on last edited by
                                #31

                                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."

                                L 1 Reply Last reply
                                0
                                • P phil o

                                  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."

                                  L Offline
                                  L Offline
                                  Lost User
                                  wrote on last edited by
                                  #32

                                  I found myself thinking about this when I woke up this morning and you are, of course, quite correct.

                                  1 Reply Last reply
                                  0
                                  Reply
                                  • Reply as topic
                                  Log in to reply
                                  • Oldest to Newest
                                  • Newest to Oldest
                                  • Most Votes


                                  • Login

                                  • Don't have an account? Register

                                  • Login or register to search.
                                  • First post
                                    Last post
                                  0
                                  • Categories
                                  • Recent
                                  • Tags
                                  • Popular
                                  • World
                                  • Users
                                  • Groups