Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Save QImage from BYTE buffer segfaults ?

Save QImage from BYTE buffer segfaults ?

Scheduled Pinned Locked Moved Solved General and Desktop
qimagebmpbytes
43 Posts 8 Posters 11.3k Views
  • 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.
  • K Kent-Dorfman
    4 Jul 2020, 09:31

    FWIW, you cannot make the absolute assumption that buf will be 32bit word aligned. If I had to guess, that would be my guess as to why it crashes sometimes. The Qt docs ae specific about the need for buf to be 32bit word aligned.

    R Offline
    R Offline
    R-P-H
    wrote on 4 Jul 2020, 10:03 last edited by
    #5

    @Kent-Dorfman said in Save QImage from BYTE buffer segfaults ?:

    FWIW, you cannot make the absolute assumption that buf will be 32bit word aligned. If I had to guess, that would be my guess as to why it crashes sometimes. The Qt docs ae specific about the need for buf to be 32bit word aligned.

    Yes I saw that in the documentation. I assumed that if buffer is being populated the same way each time and that if it works sometimes, then it should be fine.

    Does Qt have any other way to get around this besides using another image processing library to save the image ?

    C 1 Reply Last reply 4 Jul 2020, 17:44
    0
    • S Offline
      S Offline
      SGaist
      Lifetime Qt Champion
      wrote on 4 Jul 2020, 12:47 last edited by
      #6

      What are you using to fill that buffer ?
      Where do these data come from ?

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      R 1 Reply Last reply 4 Jul 2020, 15:30
      0
      • S SGaist
        4 Jul 2020, 12:47

        What are you using to fill that buffer ?
        Where do these data come from ?

        R Offline
        R Offline
        R-P-H
        wrote on 4 Jul 2020, 15:30 last edited by
        #7

        @SGaist said in Save QImage from BYTE buffer segfaults ?:

        What are you using to fill that buffer ?
        Where do these data come from ?

        It's populated using an API call which finishes successfully. So I can only interrogate the validity of the data after its completed.

        1 Reply Last reply
        0
        • S Offline
          S Offline
          SGaist
          Lifetime Qt Champion
          wrote on 4 Jul 2020, 17:04 last edited by
          #8

          That's a bit short on details. An API call can be a method from a library your are using or a remote call to a REST service.

          What kind of image are you getting ?

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          R 1 Reply Last reply 5 Jul 2020, 09:52
          0
          • R R-P-H
            4 Jul 2020, 10:03

            @Kent-Dorfman said in Save QImage from BYTE buffer segfaults ?:

            FWIW, you cannot make the absolute assumption that buf will be 32bit word aligned. If I had to guess, that would be my guess as to why it crashes sometimes. The Qt docs ae specific about the need for buf to be 32bit word aligned.

            Yes I saw that in the documentation. I assumed that if buffer is being populated the same way each time and that if it works sometimes, then it should be fine.

            Does Qt have any other way to get around this besides using another image processing library to save the image ?

            C Offline
            C Offline
            Christian Ehrlicher
            Lifetime Qt Champion
            wrote on 4 Jul 2020, 17:44 last edited by
            #9

            @R-P-H said in Save QImage from BYTE buffer segfaults ?:

            I assumed that if buffer is being populated the same way each time and that if it works sometimes, then it should be fine.

            Even if it does it would depend on your image size (or better: bytes per line). If it's a multiple of 4 it does not crash, if it's something else the alignment is wrong.

            Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
            Visit the Qt Academy at https://academy.qt.io/catalog

            R 1 Reply Last reply 5 Jul 2020, 09:53
            2
            • S SGaist
              4 Jul 2020, 17:04

              That's a bit short on details. An API call can be a method from a library your are using or a remote call to a REST service.

              What kind of image are you getting ?

              R Offline
              R Offline
              R-P-H
              wrote on 5 Jul 2020, 09:52 last edited by
              #10

              @SGaist said in Save QImage from BYTE buffer segfaults ?:

              That's a bit short on details. An API call can be a method from a library your are using or a remote call to a REST service.

              What kind of image are you getting ?

              It's from a library. The API reference is very short on details. It's a 256 gray-level image.

              1 Reply Last reply
              0
              • C Christian Ehrlicher
                4 Jul 2020, 17:44

                @R-P-H said in Save QImage from BYTE buffer segfaults ?:

                I assumed that if buffer is being populated the same way each time and that if it works sometimes, then it should be fine.

                Even if it does it would depend on your image size (or better: bytes per line). If it's a multiple of 4 it does not crash, if it's something else the alignment is wrong.

                R Offline
                R Offline
                R-P-H
                wrote on 5 Jul 2020, 09:53 last edited by
                #11

                @Christian-Ehrlicher said in Save QImage from BYTE buffer segfaults ?:

                @R-P-H said in Save QImage from BYTE buffer segfaults ?:

                I assumed that if buffer is being populated the same way each time and that if it works sometimes, then it should be fine.

                Even if it does it would depend on your image size (or better: bytes per line). If it's a multiple of 4 it does not crash, if it's something else the alignment is wrong.

                The image size is always the same (260 x 300 px).

                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on 5 Jul 2020, 18:29 last edited by
                  #12

                  And one byte per pixel ?

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  R 1 Reply Last reply 5 Jul 2020, 23:45
                  0
                  • S SGaist
                    5 Jul 2020, 18:29

                    And one byte per pixel ?

                    R Offline
                    R Offline
                    R-P-H
                    wrote on 5 Jul 2020, 23:45 last edited by
                    #13

                    @SGaist said in Save QImage from BYTE buffer segfaults ?:

                    And one byte per pixel ?

                    That is correct yes.

                    1 Reply Last reply
                    0
                    • S Offline
                      S Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on 6 Jul 2020, 20:10 last edited by
                      #14

                      Can you get the stack trace of the crash ?

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      R 1 Reply Last reply 6 Jul 2020, 21:26
                      0
                      • S SGaist
                        6 Jul 2020, 20:10

                        Can you get the stack trace of the crash ?

                        R Offline
                        R Offline
                        R-P-H
                        wrote on 6 Jul 2020, 21:26 last edited by
                        #15

                        @SGaist said in Save QImage from BYTE buffer segfaults ?:

                        Can you get the stack trace of the crash ?

                        I'm testing the application on another machine using the executable. I don't think I'd be able to get it without QT or another IDE right ?

                        1 Reply Last reply
                        0
                        • S Offline
                          S Offline
                          SGaist
                          Lifetime Qt Champion
                          wrote on 7 Jul 2020, 20:48 last edited by
                          #16

                          Windows machine ?

                          Interested in AI ? www.idiap.ch
                          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                          R 1 Reply Last reply 7 Jul 2020, 21:59
                          0
                          • S SGaist
                            7 Jul 2020, 20:48

                            Windows machine ?

                            R Offline
                            R Offline
                            R-P-H
                            wrote on 7 Jul 2020, 21:59 last edited by
                            #17

                            @SGaist said in Save QImage from BYTE buffer segfaults ?:

                            Windows machine ?

                            Yes it is. Windows 7 and also Windows 10.

                            1 Reply Last reply
                            0
                            • M Offline
                              M Offline
                              mranger90
                              wrote on 8 Jul 2020, 13:44 last edited by
                              #18

                              try:
                              BYTE *buf = new BYTE[imWidth * imHeight];

                              R 1 Reply Last reply 8 Jul 2020, 16:26
                              1
                              • M mranger90
                                8 Jul 2020, 13:44

                                try:
                                BYTE *buf = new BYTE[imWidth * imHeight];

                                R Offline
                                R Offline
                                R-P-H
                                wrote on 8 Jul 2020, 16:26 last edited by
                                #19

                                @mranger90 said in Save QImage from BYTE buffer segfaults ?:

                                try:
                                BYTE *buf = new BYTE[imWidth * imHeight];

                                Hi, it is not crashing anymore, however the image seems to be coming out completely black. I will confirm tomorrow if the image is supposed to be completely black or not...

                                1 Reply Last reply
                                0
                                • J Offline
                                  J Offline
                                  Jarek B
                                  wrote on 8 Jul 2020, 16:32 last edited by
                                  #20

                                  From the documentation
                                  https://doc.qt.io/qt-5/qimage.html#QImage-4
                                  data must be 32-bit aligned, and each scanline of data in the image must also be 32-bit aligned.

                                  So (as far as I understand) that is not enough to have memory buffer aligned to 32 bit address, also each line have to be aligned to 32 bit address. So if you have image that is 260x300 pixels, a whole line will take 288 bytes. So for whole image you should have 288*300 bytes which is more than you have provided.

                                  R 1 Reply Last reply 8 Jul 2020, 16:48
                                  2
                                  • J Jarek B
                                    8 Jul 2020, 16:32

                                    From the documentation
                                    https://doc.qt.io/qt-5/qimage.html#QImage-4
                                    data must be 32-bit aligned, and each scanline of data in the image must also be 32-bit aligned.

                                    So (as far as I understand) that is not enough to have memory buffer aligned to 32 bit address, also each line have to be aligned to 32 bit address. So if you have image that is 260x300 pixels, a whole line will take 288 bytes. So for whole image you should have 288*300 bytes which is more than you have provided.

                                    R Offline
                                    R Offline
                                    R-P-H
                                    wrote on 8 Jul 2020, 16:48 last edited by
                                    #21

                                    @Jarek-B said in Save QImage from BYTE buffer segfaults ?:

                                    From the documentation
                                    https://doc.qt.io/qt-5/qimage.html#QImage-4
                                    data must be 32-bit aligned, and each scanline of data in the image must also be 32-bit aligned.

                                    So (as far as I understand) that is not enough to have memory buffer aligned to 32 bit address, also each line have to be aligned to 32 bit address. So if you have image that is 260x300 pixels, a whole line will take 288 bytes. So for whole image you should have 288*300 bytes which is more than you have provided.

                                    Hi, interesting...I have not seen any examples like that. How are you arriving at 288 bytes ? Are you suggesting I make the buffer 288x300 bytes instead ?

                                    M J 2 Replies Last reply 8 Jul 2020, 17:00
                                    0
                                    • R R-P-H
                                      8 Jul 2020, 16:48

                                      @Jarek-B said in Save QImage from BYTE buffer segfaults ?:

                                      From the documentation
                                      https://doc.qt.io/qt-5/qimage.html#QImage-4
                                      data must be 32-bit aligned, and each scanline of data in the image must also be 32-bit aligned.

                                      So (as far as I understand) that is not enough to have memory buffer aligned to 32 bit address, also each line have to be aligned to 32 bit address. So if you have image that is 260x300 pixels, a whole line will take 288 bytes. So for whole image you should have 288*300 bytes which is more than you have provided.

                                      Hi, interesting...I have not seen any examples like that. How are you arriving at 288 bytes ? Are you suggesting I make the buffer 288x300 bytes instead ?

                                      M Offline
                                      M Offline
                                      mranger90
                                      wrote on 8 Jul 2020, 17:00 last edited by mranger90 7 Aug 2020, 17:01
                                      #22

                                      @R-P-H Of course it's black, the data never gets initialized.
                                      Also, the reason why it doesn't crash is because:
                                      BYTE *buf = new BYTE(x * y); // allocates a single byte, initialized to the value of (x * y)
                                      BYTE *buf = new BYTE[x * y]; // allocates an array of bytes whose size is x * y

                                      R 2 Replies Last reply 8 Jul 2020, 17:08
                                      0
                                      • M mranger90
                                        8 Jul 2020, 17:00

                                        @R-P-H Of course it's black, the data never gets initialized.
                                        Also, the reason why it doesn't crash is because:
                                        BYTE *buf = new BYTE(x * y); // allocates a single byte, initialized to the value of (x * y)
                                        BYTE *buf = new BYTE[x * y]; // allocates an array of bytes whose size is x * y

                                        R Offline
                                        R Offline
                                        R-P-H
                                        wrote on 8 Jul 2020, 17:08 last edited by
                                        #23

                                        @mranger90 said in Save QImage from BYTE buffer segfaults ?:

                                        @R-P-H Of course it's black, the data never gets initialized.
                                        Also, the reason why it doesn't crash is because:
                                        BYTE *buf = new BYTE(x * y); // allocates a single byte, initialized to the value of (x * y)
                                        BYTE *buf = new BYTE[x * y]; // allocates an array of bytes whose size is x * y

                                        I don't quite understand what you're saying to be honest. Where are you saying the issue is ?

                                        M 1 Reply Last reply 8 Jul 2020, 17:27
                                        0
                                        • R R-P-H
                                          8 Jul 2020, 17:08

                                          @mranger90 said in Save QImage from BYTE buffer segfaults ?:

                                          @R-P-H Of course it's black, the data never gets initialized.
                                          Also, the reason why it doesn't crash is because:
                                          BYTE *buf = new BYTE(x * y); // allocates a single byte, initialized to the value of (x * y)
                                          BYTE *buf = new BYTE[x * y]; // allocates an array of bytes whose size is x * y

                                          I don't quite understand what you're saying to be honest. Where are you saying the issue is ?

                                          M Offline
                                          M Offline
                                          mranger90
                                          wrote on 8 Jul 2020, 17:27 last edited by
                                          #24

                                          @R-P-H here is the amended code

                                          // allocates a buffer of imWidth * imHeight bytes, which  depending on the compiler 
                                          // settings will either be initialized to zero, or may contain garbage
                                          BYTE *buf = new BYTE[imWidth * imHeight];
                                          
                                          // creates a QImage based on the data in the buffer, 
                                          QImage img(buf, imWidth, imHeight, QImage::Format_Grayscale8);
                                          
                                          // saves the data
                                          img.save("image.bmp", "BMP");
                                          delete [] buf;
                                          
                                          

                                          The point is that you never put actual image data into the buffer.

                                          R 1 Reply Last reply 8 Jul 2020, 17:56
                                          0

                                          14/43

                                          6 Jul 2020, 20:10

                                          topic:navigator.unread, 29
                                          • Login

                                          • Login or register to search.
                                          14 out of 43
                                          • First post
                                            14/43
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved