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. constructing image using img.setpixel(x,y,qRgb())

constructing image using img.setpixel(x,y,qRgb())

Scheduled Pinned Locked Moved Unsolved General and Desktop
13 Posts 3 Posters 1.1k Views 1 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.
  • P Prakash08

    I'm constructing the image from the pixel values stored in a integer vector. i have three vectors for storing r,g,b values of each pixel and later i will retreive the same and construct the image. while retrieving from the vectors the values of 1st pixel are 36,155,92. but after constructing the image the values of the same are 187,202,39. why both are not the same ?

                ```
    
    for (int i = 0; i < 1; ++i) {
                        for(int j=0;j<2;j++){
                            int x = i % 2;
                            int y = i / 2;
                            int rVal = currentFrameRed[i];
                            int gVal = currentFrameGreen[i];
                            int bVal = currentFrameBlue[i];
                            qDebug()<<rVal<< gVal<< bVal;
                            img.setPixel(x, y, qRgb(rVal, gVal, bVal));
                            QRgb n=qRgb(rVal, gVal, bVal);
                            QString hex=QString::number(n,16);
                            qDebug()<<hex;
                            qDebug()<<qRgb(rVal, gVal, bVal);
                        }
                    }
    
    in the above code i am constructing a 2x2 image. currentFrameRed, currentFrameGreen, currentFrameBlue are the integer vectors that store color values of each pixel.  and i'm using qDebug() to verify the pixel values before and after constructing the image.
    Pl45m4P Offline
    Pl45m4P Offline
    Pl45m4
    wrote on last edited by
    #4

    @Prakash08 said in constructing image using img.setpixel(x,y,qRgb()):'

    for (int i = 0; i < 1; ++i) {
                        for(int j=0;j<2;j++){
                            int x = i % 2;
                            int y = i / 2;
    

    As @jsulm wrote, are you aware that this loop and these x and y values might not do what you think they do?!
    Your X is always 0. (i is always 0, and so is x = i mod 2)

    In addition:
    See what qRgb documentation states:

    QRgb qRgb(int r, int g, int b)

    Returns the ARGB quadruplet (255, r, g, b).

    So in your hex conversion you have a 255


    If debugging is the process of removing software bugs, then programming must be the process of putting them in.

    ~E. W. Dijkstra

    1 Reply Last reply
    1
    • P Offline
      P Offline
      Prakash08
      wrote on last edited by
      #5

      yeah i have255 in it

      Pl45m4P 1 Reply Last reply
      0
      • P Prakash08

        yeah i have255 in it

        Pl45m4P Offline
        Pl45m4P Offline
        Pl45m4
        wrote on last edited by
        #6

        @Prakash08 said in constructing image using img.setpixel(x,y,qRgb()):

        yeah i have255 in it

        Can you say what's wrong and give an example what you actually get?


        If debugging is the process of removing software bugs, then programming must be the process of putting them in.

        ~E. W. Dijkstra

        1 Reply Last reply
        0
        • P Offline
          P Offline
          Prakash08
          wrote on last edited by
          #7

          my problem is i'm storing red, green and blue value of each pixel in respective color vectors in the form of integer. when i start constructing image with img.setpixel(x,y,qRgb(rVal,gVal,bVal) the image is being constructed with some width and height. Later after construction of image, the RGB values of each pixel is not matching with the values stored inside the vectors .. how is that ?

          jsulmJ Pl45m4P 2 Replies Last reply
          0
          • P Prakash08

            my problem is i'm storing red, green and blue value of each pixel in respective color vectors in the form of integer. when i start constructing image with img.setpixel(x,y,qRgb(rVal,gVal,bVal) the image is being constructed with some width and height. Later after construction of image, the RGB values of each pixel is not matching with the values stored inside the vectors .. how is that ?

            jsulmJ Offline
            jsulmJ Offline
            jsulm
            Lifetime Qt Champion
            wrote on last edited by
            #8

            @Prakash08 said in constructing image using img.setpixel(x,y,qRgb()):

            my problem

            Your problem is that your code is wrong as already stated - are you going to ignore that? Fix the code...

            https://forum.qt.io/topic/113070/qt-code-of-conduct

            Pl45m4P 1 Reply Last reply
            2
            • P Prakash08

              my problem is i'm storing red, green and blue value of each pixel in respective color vectors in the form of integer. when i start constructing image with img.setpixel(x,y,qRgb(rVal,gVal,bVal) the image is being constructed with some width and height. Later after construction of image, the RGB values of each pixel is not matching with the values stored inside the vectors .. how is that ?

              Pl45m4P Offline
              Pl45m4P Offline
              Pl45m4
              wrote on last edited by Pl45m4
              #9

              @Prakash08 said in constructing image using img.setpixel(x,y,qRgb()):

              my problem is i'm storing red, green and blue value of each pixel in respective color vectors in the form of integer. when i start constructing image with img.setpixel(x,y,qRgb(rVal,gVal,bVal) the image is being constructed with some width and height. Later after construction of image, the RGB values of each pixel is not matching with the values stored inside the vectors .. how is that ?

              You are misunderstanding what qRgb(r, g, b) does. Read that part of the documentation I've linked above.

              Besides that your loop and indices are wrong, your code is correct, but you are just interpreting it wrong.

              Change the last line of debug from

              qDebug() << qRgb(rVal, gVal, bVal);
              

              to

              qDebug() << qRed(n) << qGreen(n) << qBlue(n);
              

              where n is your constructed QRgb triplet.

              Then you will get the same color values as in your three vectors.
              Setting qRgb to your image won't change anything as you thought at first. Everything works as expected.

              The issue with your current qDebug() output is that qRgb(r,g,b) will always add the alpha value a (= 255) as the code shows:

              inline Q_DECL_CONSTEXPR QRgb qRgb(int r, int g, int b)// set RGB value
              { return (0xffu << 24) | ((r & 0xffu) << 16) | ((g & 0xffu) << 8) | (b & 0xffu); }
              

              That's also why your hex string will start with ff


              If debugging is the process of removing software bugs, then programming must be the process of putting them in.

              ~E. W. Dijkstra

              1 Reply Last reply
              2
              • P Offline
                P Offline
                Prakash08
                wrote on last edited by
                #10
                            int i=0;
                            for (int j = 0; j < 2; ++j) {
                                for(int k=0;k<2;k++){
                                    int x = j;
                                    int y = k;
                                    int rVal = currentFrameRed[i];
                                    int gVal = currentFrameGreen[i];
                                    int bVal = currentFrameBlue[i];
                                    ++i;
                
                                    qDebug()<<rVal<< gVal<< bVal;
                                    img.setPixel(x, y, qRgb(rVal, gVal, bVal));
                                    QRgb n=qRgb(rVal, gVal, bVal);
                                    QString hex=QString::number(n,16);
                                    qDebug()<<hex;
                                    qDebug() << qRed(n) << qGreen(n) << qBlue(n);
                                }
                            }
                

                i have changed the above code to set pixel at correct position. but the problem is :
                actual pixel values:
                pixel-1: 207,209,1131
                pixel-2: 2,185,169
                pixel-3: 165,133, 205
                pixel-4: 18,180,121

                constructed image:
                pixel-1: 134,211,135
                pixel-2: 111,188,172
                pixel-3: 85,162,146
                pixel-4: 72, 149, 133

                how should i modify the the code in order to have my actual pixel values and constructed pixel values to be same ?

                1 Reply Last reply
                0
                • jsulmJ jsulm

                  @Prakash08 said in constructing image using img.setpixel(x,y,qRgb()):

                  my problem

                  Your problem is that your code is wrong as already stated - are you going to ignore that? Fix the code...

                  Pl45m4P Offline
                  Pl45m4P Offline
                  Pl45m4
                  wrote on last edited by Pl45m4
                  #11

                  @jsulm said in constructing image using img.setpixel(x,y,qRgb()):

                  Your problem is that your code is wrong as already stated - are you going to ignore that? Fix the code...

                  @Prakash08

                  Can't believe that I've done this, but enjoy

                      QImage img(QSize(2,2), QImage::Format_RGB32);
                      QVector<int> vRed   { 20,  40,  80, 160 };
                      QVector<int> vGreen { 10,  30,  60, 120 };
                      QVector<int> vBlue  {  5,  10,  20,  40 };
                      //                   0/0, 0/1, 1/0, 1/1
                  
                      int x = 0;
                      int y = 0;
                      Q_ASSERT( (vRed.size() == vGreen.size()) && (vRed.size() == vBlue.size()) );
                      for (int i = 0; i < 4; i++){
                  
                     //     if (i >= 2)
                     //        x = 1;
                     //     else
                     //        x = 0;
                     //
                     //     int y = i % 2;
                  
                    // Even better and shorter:
                          if (i > 0)
                              x = i % (y+i);
                          y = i % 2;
                    // for 2x2 and all colors same size
                  
                          int rVal = vRed.at(i);
                          int gVal = vGreen.at(i);
                          int bVal = vBlue.at(i);
                  
                          img.setPixel(x, y, qRgb(rVal, gVal, bVal));
                  
                          qDebug() << "\n";
                          qDebug() << "( " << x << " | " << y << " )";
                          qDebug() << "Vector RGB: " << rVal << gVal << bVal;
                          QRgb n = qRgb(rVal, gVal, bVal);
                          QString hex = QString::number( n,16 );
                          qDebug() << hex;
                          qDebug() << "Pixel RGB: " << qRed(n) << qGreen(n) << qBlue(n);
                      }
                  

                  Impossible to solve, right? :)
                  Try to understand why your loop was still wrong. You corrected the output now after my comment, but as @jsulm said two times, you had to fix your loop also (i, j, x and y).
                  My code above should work for you.

                  Output

                  (  0  |  0  )
                  Vector RGB:  20 10 5
                  "ff140a05"
                  Pixel RGB:  20 10 5
                  
                  
                  (  0  |  1  )
                  Vector RGB:  40 30 10
                  "ff281e0a"
                  Pixel RGB:  40 30 10
                  
                  
                  (  1  |  0  )
                  Vector RGB:  80 60 20
                  "ff503c14"
                  Pixel RGB:  80 60 20
                  
                  
                  (  1  |  1  )
                  Vector RGB:  160 120 40
                  "ffa07828"
                  Pixel RGB:  160 120 40
                  

                  Edit:
                  Improved loop and x/y condition


                  If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                  ~E. W. Dijkstra

                  P Pl45m4P 2 Replies Last reply
                  1
                  • Pl45m4P Pl45m4

                    @jsulm said in constructing image using img.setpixel(x,y,qRgb()):

                    Your problem is that your code is wrong as already stated - are you going to ignore that? Fix the code...

                    @Prakash08

                    Can't believe that I've done this, but enjoy

                        QImage img(QSize(2,2), QImage::Format_RGB32);
                        QVector<int> vRed   { 20,  40,  80, 160 };
                        QVector<int> vGreen { 10,  30,  60, 120 };
                        QVector<int> vBlue  {  5,  10,  20,  40 };
                        //                   0/0, 0/1, 1/0, 1/1
                    
                        int x = 0;
                        int y = 0;
                        Q_ASSERT( (vRed.size() == vGreen.size()) && (vRed.size() == vBlue.size()) );
                        for (int i = 0; i < 4; i++){
                    
                       //     if (i >= 2)
                       //        x = 1;
                       //     else
                       //        x = 0;
                       //
                       //     int y = i % 2;
                    
                      // Even better and shorter:
                            if (i > 0)
                                x = i % (y+i);
                            y = i % 2;
                      // for 2x2 and all colors same size
                    
                            int rVal = vRed.at(i);
                            int gVal = vGreen.at(i);
                            int bVal = vBlue.at(i);
                    
                            img.setPixel(x, y, qRgb(rVal, gVal, bVal));
                    
                            qDebug() << "\n";
                            qDebug() << "( " << x << " | " << y << " )";
                            qDebug() << "Vector RGB: " << rVal << gVal << bVal;
                            QRgb n = qRgb(rVal, gVal, bVal);
                            QString hex = QString::number( n,16 );
                            qDebug() << hex;
                            qDebug() << "Pixel RGB: " << qRed(n) << qGreen(n) << qBlue(n);
                        }
                    

                    Impossible to solve, right? :)
                    Try to understand why your loop was still wrong. You corrected the output now after my comment, but as @jsulm said two times, you had to fix your loop also (i, j, x and y).
                    My code above should work for you.

                    Output

                    (  0  |  0  )
                    Vector RGB:  20 10 5
                    "ff140a05"
                    Pixel RGB:  20 10 5
                    
                    
                    (  0  |  1  )
                    Vector RGB:  40 30 10
                    "ff281e0a"
                    Pixel RGB:  40 30 10
                    
                    
                    (  1  |  0  )
                    Vector RGB:  80 60 20
                    "ff503c14"
                    Pixel RGB:  80 60 20
                    
                    
                    (  1  |  1  )
                    Vector RGB:  160 120 40
                    "ffa07828"
                    Pixel RGB:  160 120 40
                    

                    Edit:
                    Improved loop and x/y condition

                    P Offline
                    P Offline
                    Prakash08
                    wrote on last edited by
                    #12

                    @Pl45m4 said in constructing image using img.setpixel(x,y,qRgb()):

                    Q_ASSERT( (vRed.size() == vGreen.size()) && (vRed.size() == vBlue.size()) );

                    may I know why this line is used ?

                    1 Reply Last reply
                    0
                    • Pl45m4P Pl45m4

                      @jsulm said in constructing image using img.setpixel(x,y,qRgb()):

                      Your problem is that your code is wrong as already stated - are you going to ignore that? Fix the code...

                      @Prakash08

                      Can't believe that I've done this, but enjoy

                          QImage img(QSize(2,2), QImage::Format_RGB32);
                          QVector<int> vRed   { 20,  40,  80, 160 };
                          QVector<int> vGreen { 10,  30,  60, 120 };
                          QVector<int> vBlue  {  5,  10,  20,  40 };
                          //                   0/0, 0/1, 1/0, 1/1
                      
                          int x = 0;
                          int y = 0;
                          Q_ASSERT( (vRed.size() == vGreen.size()) && (vRed.size() == vBlue.size()) );
                          for (int i = 0; i < 4; i++){
                      
                         //     if (i >= 2)
                         //        x = 1;
                         //     else
                         //        x = 0;
                         //
                         //     int y = i % 2;
                      
                        // Even better and shorter:
                              if (i > 0)
                                  x = i % (y+i);
                              y = i % 2;
                        // for 2x2 and all colors same size
                      
                              int rVal = vRed.at(i);
                              int gVal = vGreen.at(i);
                              int bVal = vBlue.at(i);
                      
                              img.setPixel(x, y, qRgb(rVal, gVal, bVal));
                      
                              qDebug() << "\n";
                              qDebug() << "( " << x << " | " << y << " )";
                              qDebug() << "Vector RGB: " << rVal << gVal << bVal;
                              QRgb n = qRgb(rVal, gVal, bVal);
                              QString hex = QString::number( n,16 );
                              qDebug() << hex;
                              qDebug() << "Pixel RGB: " << qRed(n) << qGreen(n) << qBlue(n);
                          }
                      

                      Impossible to solve, right? :)
                      Try to understand why your loop was still wrong. You corrected the output now after my comment, but as @jsulm said two times, you had to fix your loop also (i, j, x and y).
                      My code above should work for you.

                      Output

                      (  0  |  0  )
                      Vector RGB:  20 10 5
                      "ff140a05"
                      Pixel RGB:  20 10 5
                      
                      
                      (  0  |  1  )
                      Vector RGB:  40 30 10
                      "ff281e0a"
                      Pixel RGB:  40 30 10
                      
                      
                      (  1  |  0  )
                      Vector RGB:  80 60 20
                      "ff503c14"
                      Pixel RGB:  80 60 20
                      
                      
                      (  1  |  1  )
                      Vector RGB:  160 120 40
                      "ffa07828"
                      Pixel RGB:  160 120 40
                      

                      Edit:
                      Improved loop and x/y condition

                      Pl45m4P Offline
                      Pl45m4P Offline
                      Pl45m4
                      wrote on last edited by Pl45m4
                      #13

                      @Prakash08 said in constructing image using img.setpixel(x,y,qRgb()):

                      Q_ASSERT( (vRed.size() == vGreen.size()) && (vRed.size() == vBlue.size()) );

                      may I know why this line is used ?

                      In my updated code I used

                      for (int i = 0; i < vRed.size(); i++){
                      }
                      

                      instead of

                      
                      for (int i = 0; i < 4; i++){
                      }
                      

                      Therefore all three color vectors have to have the same length. Tried to make the code as variable as possible, to make it work for 3x3, 4x4 or other image dimensions. But then you would have to re-think the X, Y coordinate handling anyway.

                      So this code

                      Q_ASSERT( (vRed.size() == vGreen.size()) && (vRed.size() == vBlue.size()) );
                      

                      will stop/interrupt the execution of the program if the condition inside is false. In this case you gonna know directly where and why it stopped instead of crashing somewhere else randomly because the vectors are not the same size.
                      Not really needed here, but might help in other places and when you work on bigger projects.
                      Q_ASSERT is just the Qt macro to call assert() from cassert.h


                      If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                      ~E. W. Dijkstra

                      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