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