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. RAW8 pixel format to QImage. A little problem...
QtWS25 Last Chance

RAW8 pixel format to QImage. A little problem...

Scheduled Pinned Locked Moved General and Desktop
qimageraw images
17 Posts 3 Posters 8.4k 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.
  • L Offline
    L Offline
    Leonardo
    wrote on last edited by
    #7

    @Insidious_Snot, you just need to pad your pixels, so each of them takes 4 bytes. Once I needed to use 24bit RGB data with QImage. Here's what I did:

    uchar* output = (uchar*) malloc(width*height*4);
    int in_size = width*height*3;
    
    for(int i = 0 , j = 0 ; i < in_size ; i += 3, j+= 4){
    
    	output[j] = input[i];
    	output[j+1] = input[i+1];
    	output[j+2] = input[i+2];
    	output[j+3] = 0;
    
    }
    
    QImage img(output, width, height, QImage::Format_RGB32, free, output);
    

    If you're doing live processing, maybe you should consider working on the raw data yourself, instead of relying on QImage. Or maybe you could use some more specialized library, like OpenCV.

    1 Reply Last reply
    0
    • Insidious_SnotI Insidious_Snot

      @Leonardo you are right. But how I do that? Make a QPalette for this and then get the Data. I'm a little confused (and also new in Qt so keep calm with my questions ;)...)

      @codebit you think that the way to have a solution is that I said to @Leonardo ?

      I think that its to much processing for live image and the fps will slow down :(.

      codebitC Offline
      codebitC Offline
      codebit
      wrote on last edited by
      #8

      @Insidious_Snot No, QPalette is for the window system. What I'm saying you should look at the documentation of Image::Convert( PIXEL_FORMAT_RAW8, &newImg ) and figure what it creates. Chances are it creates a gray-scaled 8-bit indexed image (in this case your code is right) or it creates a colored 8-bit indexed image in which case it should provide you with the palette that is being used.
      We have no clue where this Image class comes from :)

      1 Reply Last reply
      0
      • Insidious_SnotI Offline
        Insidious_SnotI Offline
        Insidious_Snot
        wrote on last edited by Insidious_Snot
        #9

        @codebit the reference for PIXEL_FORMAT_RAW8 at camera's API is;

        PIXEL_FORMAT_RAW8 = 0x00400000, /**< 8 bit raw data output of sensor. */

        Also full description for Image::Convert(...) is;

                 * Converts the current image buffer to the specified output format and
                 * stores the result in the specified image. The destination image 
                 * does not need to be configured in any way before the call is made.
                 *
                 * @param format Output format of the converted image.
                 * @param pDestImage Destination image.
                 *
                 * @return An Error indicating the success or failure of the function.
                 */ 
                virtual Error Convert( 
                    PixelFormat format, 
                    Image*      pDestImage ) const;
        

        The camera constructor makes clear that I can use it's full resolution only with that pixel format. As I see in the test program that come with the device, the pix format is RAW8 and I have color image.

        Forthwith I tried to make the conversion to RGB format (RGB for Camera's API 24bit and RGB888 for Qt) and I have the live image in resolution I want but in very low frame rate which caused by data processing and not from camera setting.

        @Leonardo thanks for your help and your code ;). Unfortunately it doesn't works. It appears the image above:

        http://bit.ly/1Vie335

        Of course I didn't use your code block unchanged but I made the suitable mods in order to work correctly with the rest code. Take a look here;

            uchar* output = (uchar*) malloc(width*height*4);
            int in_size = width*height*3;
            int j;
            for(int i = 0 , j = 0 ; i < in_size ; i += 3, j+= 4)
            {
                output[j] = (uchar)newImg[i];
                output[j+1] = (uchar)newImg[i+1];
                output[j+2] = (uchar)newImg[i+2];
                output[j+3] = 0;
            }
            (*grabedFrame) = img.copy();```
        1 Reply Last reply
        0
        • L Offline
          L Offline
          Leonardo
          wrote on last edited by
          #10

          Hi. Show your code, please.

          Insidious_SnotI 1 Reply Last reply
          0
          • L Leonardo

            Hi. Show your code, please.

            Insidious_SnotI Offline
            Insidious_SnotI Offline
            Insidious_Snot
            wrote on last edited by
            #11

            @Leonardo I 've mod my previews answer. See there!

            1 Reply Last reply
            0
            • L Offline
              L Offline
              Leonardo
              wrote on last edited by
              #12

              Hi. Since you're using a 8bit image, your input is 1 byte per pixel. So:

              uchar* output = (uchar*) malloc(width*height*4);
              int in_size = width*height;
              int j;
              for(int i = 0 , j = 0 ; i < in_size ; i++, j+= 4)
              {
                  output[j] = (uchar)newImg[i];
                  output[j+1] = 0;
                  output[j+2] = 0;
                  output[j+3] = 0;
              }
              
              Insidious_SnotI 1 Reply Last reply
              0
              • L Leonardo

                Hi. Since you're using a 8bit image, your input is 1 byte per pixel. So:

                uchar* output = (uchar*) malloc(width*height*4);
                int in_size = width*height;
                int j;
                for(int i = 0 , j = 0 ; i < in_size ; i++, j+= 4)
                {
                    output[j] = (uchar)newImg[i];
                    output[j+1] = 0;
                    output[j+2] = 0;
                    output[j+3] = 0;
                }
                
                Insidious_SnotI Offline
                Insidious_SnotI Offline
                Insidious_Snot
                wrote on last edited by Insidious_Snot
                #13

                @Leonardo it returns me that now ;
                http://bit.ly/1LJPXIo

                    uchar* output = (uchar*) malloc(width*height*4);
                    int in_size = width*height;
                    int j;
                    for(int i = 0 , j = 0 ; i < in_size ; i++, j+= 4)
                    {
                        output[j] = (uchar)newImg[i];
                        output[j+1] = 0;
                        output[j+2] = 0;
                        output[j+3] = 0;
                    }
                    QImage img(output, width, height, QImage::Format_RGB32, free, output);
                    (*grabedFrame) = img.copy();
                
                1 Reply Last reply
                0
                • L Offline
                  L Offline
                  Leonardo
                  wrote on last edited by
                  #14

                  Oh, I see the constructors available for Qt 4.8 are different. The one in my code is for Qt 5.5. I didn't know this one in which you can specify the number of bytes per line. You were right from the start. Your first code should work, according to the documentation.

                           QImage tmpImg( (uchar *)newImg.GetData(), width, height, width, QImage::Format_Indexed8);
                  

                  I'm interested in this issue. Would you mind dumping your raw data to a file and posting it here? I'd like to try it later.

                  Insidious_SnotI 1 Reply Last reply
                  0
                  • Insidious_SnotI Offline
                    Insidious_SnotI Offline
                    Insidious_Snot
                    wrote on last edited by Insidious_Snot
                    #15
                        uchar* output = (uchar*) malloc(width*height*4);
                        int in_size = width*height;
                        int j;
                        for(int i = 0 , j = 0 ; i < in_size ; i++, j+= 4)
                        {
                            output[j] = (uchar)newImg[i];
                            output[j+1] = 0;
                            output[j+2] = 0;
                            output[j+3] = 0;
                        }
                        QImage img(output, width, height, width, QImage::Format_RGB32, free, output);
                        (*grabedFrame) = img.copy();
                    

                    And returns me that : http://bit.ly/1L0fHzz

                    Of course! I would try to get it now...

                    1 Reply Last reply
                    0
                    • L Leonardo

                      Oh, I see the constructors available for Qt 4.8 are different. The one in my code is for Qt 5.5. I didn't know this one in which you can specify the number of bytes per line. You were right from the start. Your first code should work, according to the documentation.

                               QImage tmpImg( (uchar *)newImg.GetData(), width, height, width, QImage::Format_Indexed8);
                      

                      I'm interested in this issue. Would you mind dumping your raw data to a file and posting it here? I'd like to try it later.

                      Insidious_SnotI Offline
                      Insidious_SnotI Offline
                      Insidious_Snot
                      wrote on last edited by
                      #16

                      @Leonardo here is the Raw8 data : http://bit.ly/1WtnXMg

                      I have put spaces and lines in order to make it easier to read. Each line has length == columns/2 (cause the spaces I put).

                      1 Reply Last reply
                      0
                      • L Offline
                        L Offline
                        Leonardo
                        wrote on last edited by
                        #17

                        Hi. Well, it's working. Here's what I've done:

                        QFile f("D:/img.bin");
                        
                        if(f.open(QIODevice::ReadOnly)){
                        
                            QByteArray b = f.readAll();
                        
                            QImage img((const uchar*) b.constData(), 4096, 2160, 4096, QImage::Format_Indexed8);
                        
                            QVector<QRgb> colorTable;
                            for (int i = 0; i < 256; i++){
                                colorTable.push_back(qRgb(i,i,i));
                            }
                        
                            img.setColorTable(colorTable);
                        
                            img.save("D:/img.png");
                        
                            f.close();
                        
                        }
                        

                        And here's what I got:

                        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