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. From Matrix to QImage and QPixmap
Forum Updated to NodeBB v4.3 + New Features

From Matrix to QImage and QPixmap

Scheduled Pinned Locked Moved Unsolved General and Desktop
14 Posts 6 Posters 7.6k Views 2 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.
  • SGaistS Offline
    SGaistS Offline
    SGaist
    Lifetime Qt Champion
    wrote on last edited by
    #4

    I meant the matrix itself, not what its content is representing.

    Did you allocate that matrix properly ?

    On a side note, you can also use a QVector<QVector<int>> for a two dimensional storage.

    Interested in AI ? www.idiap.ch
    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

    AlvaroSA 1 Reply Last reply
    0
    • AlvaroSA AlvaroS

      @SGaist Yes, matrix values is 0 = black or 1 = white.

      I need a matrix because user can load a binary file where matrix is inside and then image has to be in a scene.

      jsulmJ Online
      jsulmJ Online
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #5

      @AlvaroS I think @SGaist wanted to know whether matrix_binary is pointing to a matrix and whether it has same dimensions as the picture (1000x938). How did you initialise matrix_binary?

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

      1 Reply Last reply
      0
      • SGaistS SGaist

        I meant the matrix itself, not what its content is representing.

        Did you allocate that matrix properly ?

        On a side note, you can also use a QVector<QVector<int>> for a two dimensional storage.

        AlvaroSA Offline
        AlvaroSA Offline
        AlvaroS
        wrote on last edited by AlvaroS
        #6

        @SGaist said:

        I meant the matrix itself, not what its content is representing.

        Did you allocate that matrix properly ?

        On a side note, you can also use a QVector<QVector<int>> for a two dimensional storage.

        @jsulm said:

        @AlvaroS I think @SGaist wanted to know whether matrix_binary is pointing to a matrix and whether it has same dimensions as the picture (1000x938). How did you initialise matrix_binary?

        Matriz_binary values are 0 or 1 (white or black), now I am trying to represent that matrix in a scene with QPixmap.

        My code looks like this right now:

                        QImage imagen(1000,938, QImage::Format_Grayscale8);
        
                        for(int i=0;i<938;++i){
                            for(int j=0;j<1000;++j)
                                if (matrix_binary[i][j] == 1)
                                    imagen.setPixel(i,j, qRgb(1,1,1));
                                else
                                    imagen.setPixel(i,j, qRgb(0,0,0));
                        }
        
                        QPixmap pixmap_scene;
                        pixmap_scene.fromImage(imagen);
                        QGraphicsPixmapItem *item = scene->addPixmap(pixmap_scene); 
        

        but in some part before "for" it crashes....
        how can I do what I want? Maybe the format image?

        Thanks a lot

        D 1 Reply Last reply
        0
        • AlvaroSA AlvaroS

          @SGaist said:

          I meant the matrix itself, not what its content is representing.

          Did you allocate that matrix properly ?

          On a side note, you can also use a QVector<QVector<int>> for a two dimensional storage.

          @jsulm said:

          @AlvaroS I think @SGaist wanted to know whether matrix_binary is pointing to a matrix and whether it has same dimensions as the picture (1000x938). How did you initialise matrix_binary?

          Matriz_binary values are 0 or 1 (white or black), now I am trying to represent that matrix in a scene with QPixmap.

          My code looks like this right now:

                          QImage imagen(1000,938, QImage::Format_Grayscale8);
          
                          for(int i=0;i<938;++i){
                              for(int j=0;j<1000;++j)
                                  if (matrix_binary[i][j] == 1)
                                      imagen.setPixel(i,j, qRgb(1,1,1));
                                  else
                                      imagen.setPixel(i,j, qRgb(0,0,0));
                          }
          
                          QPixmap pixmap_scene;
                          pixmap_scene.fromImage(imagen);
                          QGraphicsPixmapItem *item = scene->addPixmap(pixmap_scene); 
          

          but in some part before "for" it crashes....
          how can I do what I want? Maybe the format image?

          Thanks a lot

          D Offline
          D Offline
          Devopia53
          wrote on last edited by
          #7

          @AlvaroS

          Your matrix_binary allocated incorrectly. You should exchange width and height.

          like this:

          matrix = new int *[img.height()];
          for(int i=0;i<img.height();++i)
                 matrix[i] = new int [img.width()];
          

          You can also use a QVector.

          like this:

          QVector<QVector<int>> matrix(img.height(), QVector<int>(img.width(), 0)); // 0 is initial value
          
          AlvaroSA 1 Reply Last reply
          0
          • jsulmJ Online
            jsulmJ Online
            jsulm
            Lifetime Qt Champion
            wrote on last edited by
            #8

            Where exactly does it crash? Did you try to debug to see what is happening?
            And still you did not answer the question regarding matrix_binary: how did you initialize it? It is clear that it contains 0/1 but that was not the question.
            And I think you should swap i and j:

            QImage imagen(1000,938, QImage::Format_Grayscale8);
            

            width=1000, height=938
            but then you do:

            for(int i=0;i<938;++i){
                for(int j=0;j<1000;++j)
                    ...
                    imagen.setPixel(i,j, qRgb(1,1,1)); // i is x and j is y
            

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

            AlvaroSA 1 Reply Last reply
            0
            • D Devopia53

              @AlvaroS

              Your matrix_binary allocated incorrectly. You should exchange width and height.

              like this:

              matrix = new int *[img.height()];
              for(int i=0;i<img.height();++i)
                     matrix[i] = new int [img.width()];
              

              You can also use a QVector.

              like this:

              QVector<QVector<int>> matrix(img.height(), QVector<int>(img.width(), 0)); // 0 is initial value
              
              AlvaroSA Offline
              AlvaroSA Offline
              AlvaroS
              wrote on last edited by
              #9

              @Devopia53 said:

              @AlvaroS

              Your matrix_binary allocated incorrectly. You should exchange width and height.

              like this:

              matrix = new int *[img.height()];
              for(int i=0;i<img.height();++i)
                     matrix[i] = new int [img.width()];
              

              You can also use a QVector.

              like this:

              QVector<QVector<int>> matrix(img.height(), QVector<int>(img.width(), 0)); // 0 is initial value
              

              If I do what you say it does not crash, but know it says:

              .
              .
              .
              QImage::setPixel: coordinate (937,991) out of range
              QImage::setPixel: coordinate (937,992) out of range
              QImage::setPixel: coordinate (937,993) out of range
              QImage::setPixel: coordinate (937,994) out of range
              QImage::setPixel: coordinate (937,995) out of range
              .
              .
              .
              

              The code now look like this:

               int vector_binary[1000*938];
              
              /*matrix binary creation*/
                              int **matrix_binary;
                              matrix_binary = new int *[938];
                              for(int i=0;i<938;++i)
                                  matrix_binary[i] = new int [1000];
              
              /*read vecotr from a binary file*/
                              infile.read((char*)(vector_binary), sizeof(int)*1000*938);
              
              /*Initialitation of matrix_binary*/
                              for(int i=0;i<938;++i){
                                  for(int j=0;j<1000;++j){
                                      matrix_binary[i][j] = 0;
                                  }
                              }
              
              /*Store the data into matrix_binary*/
                              for(int i=0;i<938;++i){
                                  for(int j=0;j<1000;++j){
                                      matrix_binary[i][j] = vector_binary[i*1000+j];
                                      }
                              }
              
              
              
                              //From matrix to QImage to visualize
                              //Create matrix where each element will be a pixel value.
                              QImage imagen(1000,938, QImage::Format_RGB666);
                              for(int w=0;w<938;w++){
                                  for(int z=0;z<1000;z++)
                                      if (matrix_binary[w][z] == 1)
                                          imagen.setPixel(w,z, qRgb(250,250,250));
                                      else
                                          imagen.setPixel(w,z, qRgb(0,0,0));
                              }
                              //QPixmap pixmap_scene;
                              QPixmap pixmap_scene = QPixmap::fromImage(imagen);
                          }
                      }
              

              I think that the problem is in setPixel...

              W 1 Reply Last reply
              0
              • jsulmJ jsulm

                Where exactly does it crash? Did you try to debug to see what is happening?
                And still you did not answer the question regarding matrix_binary: how did you initialize it? It is clear that it contains 0/1 but that was not the question.
                And I think you should swap i and j:

                QImage imagen(1000,938, QImage::Format_Grayscale8);
                

                width=1000, height=938
                but then you do:

                for(int i=0;i<938;++i){
                    for(int j=0;j<1000;++j)
                        ...
                        imagen.setPixel(i,j, qRgb(1,1,1)); // i is x and j is y
                
                AlvaroSA Offline
                AlvaroSA Offline
                AlvaroS
                wrote on last edited by
                #10

                @jsulm said:

                Where exactly does it crash? Did you try to debug to see what is happening?
                And still you did not answer the question regarding matrix_binary: how did you initialize it? It is clear that it contains 0/1 but that was not the question.
                And I think you should swap i and j:

                QImage imagen(1000,938, QImage::Format_Grayscale8);
                

                width=1000, height=938
                but then you do:

                for(int i=0;i<938;++i){
                    for(int j=0;j<1000;++j)
                        ...
                        imagen.setPixel(i,j, qRgb(1,1,1)); // i is x and j is y
                

                Yes sorry! See my last post :)

                1 Reply Last reply
                0
                • AlvaroSA Offline
                  AlvaroSA Offline
                  AlvaroS
                  wrote on last edited by
                  #11

                  However if i save pixemap_scene in a .jpeg it save me fine with the correct image...

                  jsulmJ 1 Reply Last reply
                  0
                  • AlvaroSA AlvaroS

                    However if i save pixemap_scene in a .jpeg it save me fine with the correct image...

                    jsulmJ Online
                    jsulmJ Online
                    jsulm
                    Lifetime Qt Champion
                    wrote on last edited by
                    #12

                    @AlvaroS

                    QImage::setPixel: coordinate (937,991) out of range
                    QImage::setPixel: coordinate (937,992) out of range
                    QImage::setPixel: coordinate (937,993) out of range
                    QImage::setPixel: coordinate (937,994) out of range
                    QImage::setPixel: coordinate (937,995) out of range
                    

                    Now take a look how you initialized QImage:

                    QImage imagen(1000,938, QImage::Format_Grayscale8);
                    

                    So, max value for y is 937 but you pass values like 991!

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

                    1 Reply Last reply
                    1
                    • ? Offline
                      ? Offline
                      A Former User
                      wrote on last edited by A Former User
                      #13

                      Hi! The following is still unnecessarily slow but at least it works and doesn't waste so much memory as before:

                          const QPixmap pixmap("/home/user/myimage.jpg");
                          ui->label->setPixmap(pixmap);
                      
                          const QImage image = pixmap.toImage();
                          const int width = image.width();
                          const int height = image.height();
                          QBitArray bitArray(width*height);
                      
                          for (int h=0; h<height; ++h) {
                              for (int w=0; w<width; ++w) {
                                  bitArray[h*width+w] = qGray(image.pixel(w,h)) > 127 ? 0 : 1;
                              }
                          }
                      
                          /* Do something with the bit array here */
                      
                          QImage monoImage(width, height, QImage::Format_Mono);
                          for (int h=0; h<height; ++h) {
                              for (int w=0; w<width; ++w) {
                                  monoImage.setPixel(w, h, bitArray.at(h*width+w));
                              }
                          }
                      
                          ui->label_2->setPixmap( QPixmap::fromImage(monoImage) );
                      
                      1 Reply Last reply
                      0
                      • AlvaroSA AlvaroS

                        @Devopia53 said:

                        @AlvaroS

                        Your matrix_binary allocated incorrectly. You should exchange width and height.

                        like this:

                        matrix = new int *[img.height()];
                        for(int i=0;i<img.height();++i)
                               matrix[i] = new int [img.width()];
                        

                        You can also use a QVector.

                        like this:

                        QVector<QVector<int>> matrix(img.height(), QVector<int>(img.width(), 0)); // 0 is initial value
                        

                        If I do what you say it does not crash, but know it says:

                        .
                        .
                        .
                        QImage::setPixel: coordinate (937,991) out of range
                        QImage::setPixel: coordinate (937,992) out of range
                        QImage::setPixel: coordinate (937,993) out of range
                        QImage::setPixel: coordinate (937,994) out of range
                        QImage::setPixel: coordinate (937,995) out of range
                        .
                        .
                        .
                        

                        The code now look like this:

                         int vector_binary[1000*938];
                        
                        /*matrix binary creation*/
                                        int **matrix_binary;
                                        matrix_binary = new int *[938];
                                        for(int i=0;i<938;++i)
                                            matrix_binary[i] = new int [1000];
                        
                        /*read vecotr from a binary file*/
                                        infile.read((char*)(vector_binary), sizeof(int)*1000*938);
                        
                        /*Initialitation of matrix_binary*/
                                        for(int i=0;i<938;++i){
                                            for(int j=0;j<1000;++j){
                                                matrix_binary[i][j] = 0;
                                            }
                                        }
                        
                        /*Store the data into matrix_binary*/
                                        for(int i=0;i<938;++i){
                                            for(int j=0;j<1000;++j){
                                                matrix_binary[i][j] = vector_binary[i*1000+j];
                                                }
                                        }
                        
                        
                        
                                        //From matrix to QImage to visualize
                                        //Create matrix where each element will be a pixel value.
                                        QImage imagen(1000,938, QImage::Format_RGB666);
                                        for(int w=0;w<938;w++){
                                            for(int z=0;z<1000;z++)
                                                if (matrix_binary[w][z] == 1)
                                                    imagen.setPixel(w,z, qRgb(250,250,250));
                                                else
                                                    imagen.setPixel(w,z, qRgb(0,0,0));
                                        }
                                        //QPixmap pixmap_scene;
                                        QPixmap pixmap_scene = QPixmap::fromImage(imagen);
                                    }
                                }
                        

                        I think that the problem is in setPixel...

                        W Offline
                        W Offline
                        wangg
                        wrote on last edited by
                        #14

                        @AlvaroS you set the parameters incorrectly.The setPixel of the first is the image's cloumn and the second is row.so you should write like this :
                        for(int i=0;i<image.height();i++)
                        for(int j=0;j<image.width();j++)
                        {
                        imageset.setPixel(i,j,matrix_binary[i][j] );
                        }

                        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