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
Forum Updated to NodeBB v4.3 + New Features

Byte array to QImage

Scheduled Pinned Locked Moved Solved General and Desktop
16 Posts 8 Posters 4.7k Views 3 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.
  • Kent-DorfmanK Offline
    Kent-DorfmanK Offline
    Kent-Dorfman
    wrote on last edited by
    #2

    what does QtGui.QImageWriter.supportedImageFormats() report? That should tell you something.

    1 Reply Last reply
    0
    • 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 Online
                    hskoglundH Online
                    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 Online
                          hskoglundH Online
                          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