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. Byte array to QImage

Byte array to QImage

Scheduled Pinned Locked Moved Solved General and Desktop
16 Posts 8 Posters 4.6k 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.
  • Christian EhrlicherC Offline
    Christian EhrlicherC Offline
    Christian Ehrlicher
    Lifetime Qt Champion
    wrote on last edited by
    #3

    Do you really think the camera is sending jpeg images?

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

    1 Reply Last reply
    2
    • hardikgarg19H hardikgarg19

      I am trying to form a QImage from the Byte array and save the image. Below is the code:
      BYTE* pBuf=(BYTE*)malloc(iBytes*sy);
      I have copied all the image data in this pBuf from the camera (not copying that code)

          QImage img(1200,1920,QImage::Format_Mono);
          img = QImage::fromData((uchar*)pBuf,iBytes*sy,"JPG");
          img.save( "C:\\test_folder\\file.JPG" );
      

      After running this code, a file.JPG is saved but it is not a valid file. When I am trying to open this file the system is displaying the message "it looks like we don't support this format".
      How can I solve this issue?

      beeckscheB Offline
      beeckscheB Offline
      beecksche
      wrote on last edited by beecksche
      #4

      @hardikgarg19
      Maybe the set format is wrong. Try Format_Grayscale8 or Format_RGB32.

      Or try to leave the format blank, so QImage will detect the reading format by itself.

      QImage::fromData((uchar*)pBuf, iBytes*sy);
      

      All described in the docs

      hardikgarg19H 1 Reply Last reply
      2
      • SGaistS Offline
        SGaistS Offline
        SGaist
        Lifetime Qt Champion
        wrote on last edited by
        #5

        Hi,

        Besides the points of my fellows, are you sure about the size of the image ? 1200x1920 seems a bit non standard for a camera.

        On that point, what camera is that ?
        How do you get data from it ?
        How did you configure it ?

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

        hardikgarg19H 1 Reply Last reply
        4
        • beeckscheB beecksche

          @hardikgarg19
          Maybe the set format is wrong. Try Format_Grayscale8 or Format_RGB32.

          Or try to leave the format blank, so QImage will detect the reading format by itself.

          QImage::fromData((uchar*)pBuf, iBytes*sy);
          

          All described in the docs

          hardikgarg19H Offline
          hardikgarg19H Offline
          hardikgarg19
          wrote on last edited by
          #6

          @beecksche
          I have tried the change, but, I am getting the bool value as false and no image is created.

              QImage img(1200,1920,QImage::Format_Grayscale8);
              img = QImage::fromData((uchar*)pBuf,iBytes*sy);
              bool b = img.save( "C:\\test_folder\\file_img.BMP");
          
          1 Reply Last reply
          0
          • Christian EhrlicherC Offline
            Christian EhrlicherC Offline
            Christian Ehrlicher
            Lifetime Qt Champion
            wrote on last edited by
            #7

            You really should try to find out what format the camera is sending - guessing is not the correct solution here.

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

            hardikgarg19H 1 Reply Last reply
            2
            • mranger90M Offline
              mranger90M Offline
              mranger90
              wrote on last edited by
              #8

              I'm curious about the "iBytes * sy" in your code.
              If you are truly grabbing an 8 bit gray scale image from the camera then the size of the data will likely be just "iBytes" which, and I'm going out on a limb here, should be imageWidth * imageHeight.
              If you are multiplying this by some factor, the mysterious "sy", then the image is probably RGB24 (sy == 3 ?) or RGB32 (sy == 4 ?).

              1 Reply Last reply
              3
              • SGaistS SGaist

                Hi,

                Besides the points of my fellows, are you sure about the size of the image ? 1200x1920 seems a bit non standard for a camera.

                On that point, what camera is that ?
                How do you get data from it ?
                How did you configure it ?

                hardikgarg19H Offline
                hardikgarg19H Offline
                hardikgarg19
                wrote on last edited by
                #9

                @SGaist Hi,
                I am using a FPGA based camera (http://isgcameras.com/allegro-usb3-family/).

                Below is the code:

                long sx,sy,iBpp;
                //get the image size
                

                //pMedleyUcam is the camera object
                pMedleyUcam->get_SizeX(&sx);
                pMedleyUcam->get_SizeY(&sy);

                pMedleyUcam->GetBytesPerPixel(&iBpp);
                int iBytes=sx*iBpp; // horizontal image size in bytes

                BYTE* pBuf=(BYTE*)malloc(iBytes*sy);
                
                short v;
                pMedleyUcam->Grab(&v);
                BYTE *ptr=pBuf;
                for(int y=0;y<sy;y++)
                    {
                        pMedleyUcam->GetImagePointer(0, sy-1-y,&var);
                        memcpy(ptr,var.pbVal,iBytes);
                        ptr+=iBytes;
                    }
                

                //form the image using the pBuf
                QImage img(1200,1920,QImage::Format_Grayscale8);
                img = QImage::fromData((uchar*)pBuf,iBytes*sy);
                bool b = img.save( "C:\test_folder\file_img.BMP");

                b is returning false here

                1 Reply Last reply
                0
                • hskoglundH Offline
                  hskoglundH Offline
                  hskoglund
                  wrote on last edited by
                  #10

                  Hi, if you try with double slashes

                  bool b = img.save( "C:\\test_folder\\file_img.BMP");
                  

                  is b still returning false?

                  hardikgarg19H 1 Reply Last reply
                  2
                  • Christian EhrlicherC Christian Ehrlicher

                    You really should try to find out what format the camera is sending - guessing is not the correct solution here.

                    hardikgarg19H Offline
                    hardikgarg19H Offline
                    hardikgarg19
                    wrote on last edited by
                    #11

                    @Christian-Ehrlicher
                    The camera allows me to check the available pixel format. Below is the list:
                    Mono8
                    Mono10p
                    Mono12p
                    BayerRGB
                    BayerRGB10p
                    BayerRGB12p
                    RGB8
                    RGB565P
                    BGR8
                    YCbCr422_8
                    YUV400_8
                    YUV8_UYV

                    1 Reply Last reply
                    0
                    • hskoglundH hskoglund

                      Hi, if you try with double slashes

                      bool b = img.save( "C:\\test_folder\\file_img.BMP");
                      

                      is b still returning false?

                      hardikgarg19H Offline
                      hardikgarg19H Offline
                      hardikgarg19
                      wrote on last edited by
                      #12

                      @hskoglund Hi,
                      Yes, it is still returning false.

                      1 Reply Last reply
                      0
                      • hskoglundH Offline
                        hskoglundH Offline
                        hskoglund
                        wrote on last edited by hskoglund
                        #13

                        Looks like you're only getting the raw pixels from the camera (in the specified pixel format). To save to a file, like a BMP file., you need an header as well.
                        To get one, you could try create an empty QImage with the specified x and y size, and then fill it with those pixels you get from the camera, say something like:

                        QImage img(1200,1920,QImage::Format_Grayscale8);
                        for (int y = 0; (y < 1920); ++y)
                            for (int x = 0; (x < 1200); ++x)
                                img.setPixel(x,y,((uchar*)pBuf) + x + 1200 * y);
                        hardikgarg19H 1 Reply Last reply
                        4
                        • fcarneyF Offline
                          fcarneyF Offline
                          fcarney
                          wrote on last edited by
                          #14

                          According to this SO question you can do a line at a time:
                          https://stackoverflow.com/questions/14563180/raw-data-to-qimage

                          C++ is a perfectly valid school of magic.

                          hardikgarg19H 1 Reply Last reply
                          1
                          • hskoglundH hskoglund

                            Looks like you're only getting the raw pixels from the camera (in the specified pixel format). To save to a file, like a BMP file., you need an header as well.
                            To get one, you could try create an empty QImage with the specified x and y size, and then fill it with those pixels you get from the camera, say something like:

                            QImage img(1200,1920,QImage::Format_Grayscale8);
                            for (int y = 0; (y < 1920); ++y)
                                for (int x = 0; (x < 1200); ++x)
                                    img.setPixel(x,y,((uchar*)pBuf) + x + 1200 * y);
                            hardikgarg19H Offline
                            hardikgarg19H Offline
                            hardikgarg19
                            wrote on last edited by
                            #15

                            @hskoglund Hi,
                            Yes, that was the problem. Thank you so much.

                            1 Reply Last reply
                            0
                            • fcarneyF fcarney

                              According to this SO question you can do a line at a time:
                              https://stackoverflow.com/questions/14563180/raw-data-to-qimage

                              hardikgarg19H Offline
                              hardikgarg19H Offline
                              hardikgarg19
                              wrote on last edited by
                              #16

                              @fcarney Hi,
                              Thank you so much for sharing the link. I have used the QImage.scanLine and it worked.

                              1 Reply Last reply
                              0

                              • Login

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