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