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.6k 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.
  • hardikgarg19H Offline
    hardikgarg19H Offline
    hardikgarg19
    wrote on last edited by
    #1

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