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. Picture
Forum Updated to NodeBB v4.3 + New Features

Picture

Scheduled Pinned Locked Moved Solved General and Desktop
82 Posts 7 Posters 46.0k 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.
  • VRoninV Offline
    VRoninV Offline
    VRonin
    wrote on last edited by
    #68

    I'm surprised your compiler doesn't yell about redefinition (I probably know why but that's not the point here). I'send you to http://www.cplusplus.com/doc/tutorial/namespaces/#scopes once again

    "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
    ~Napoleon Bonaparte

    On a crusade to banish setIndexWidget() from the holy land of Qt

    kshegunovK P 2 Replies Last reply
    0
    • VRoninV VRonin

      I'm surprised your compiler doesn't yell about redefinition (I probably know why but that's not the point here). I'send you to http://www.cplusplus.com/doc/tutorial/namespaces/#scopes once again

      kshegunovK Offline
      kshegunovK Offline
      kshegunov
      Moderators
      wrote on last edited by
      #69

      @VRonin said in Picture:

      I'm surprised your compiler doesn't yell about redefinition

      Not redefinition, shadowing, hence no yelling. :)

      Read and abide by the Qt Code of Conduct

      VRoninV 1 Reply Last reply
      2
      • kshegunovK kshegunov

        @VRonin said in Picture:

        I'm surprised your compiler doesn't yell about redefinition

        Not redefinition, shadowing, hence no yelling. :)

        VRoninV Offline
        VRoninV Offline
        VRonin
        wrote on last edited by
        #70

        @kshegunov said in Picture:

        shadowing

        The case @kshegunov is explaining is in the 3rd code block of the link above:

        // inner block scopes
        #include <iostream>
        using namespace std;
        
        int main () {
          int x = 10;
          int y = 20;
          {
            int x;   // ok, inner scope.
            x = 50;  // sets value to inner x
            y = 50;  // sets value to (outer) y
            cout << "inner block:\n";
            cout << "x: " << x << '\n';
            cout << "y: " << y << '\n';
          }
          cout << "outer block:\n";
          cout << "x: " << x << '\n';
          cout << "y: " << y << '\n';
          return 0;
        }
        

        This means I should go back to that tutorial myself

        "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
        ~Napoleon Bonaparte

        On a crusade to banish setIndexWidget() from the holy land of Qt

        1 Reply Last reply
        2
        • VRoninV VRonin

          I'm surprised your compiler doesn't yell about redefinition (I probably know why but that's not the point here). I'send you to http://www.cplusplus.com/doc/tutorial/namespaces/#scopes once again

          P Offline
          P Offline
          Payx
          wrote on last edited by
          #71

          @VRonin so if i want use my picture in an other function i have to declare it before my function as i did for

          QColor dominantColor(const QImage& image, const QPoint& topLeft, const QSize& rectSize);

          so i have to add a line code QImage pixi in my .cpp ?

          why not in my .h, and why

          QColor dominantColor
          

          dont work in my .h too ?

          1 Reply Last reply
          0
          • VRoninV Offline
            VRoninV Offline
            VRonin
            wrote on last edited by
            #72

            Ok, this has become too chatty, let's make it more structured before we both get banned.

            • Put dominantColor and fillSection code from either me or @mrjj at the top of your .cpp file, just below the #includes no need to declare them in advance in this case
            • in the private: section of your .h file add QImage m_baseImag;
            • in on_push_clicked load the image from file and store it in m_baseImag then use QPixmap::fromImage(m_baseImag) to display the image in the QLabel
            • in on_push2_clicked iterate over every 4x4 square of your picture calling the two functions:
            for (int i=0;i<m_baseImag.width();i+=4){
                       for (int j=0;j<m_baseImag.height();j+=4){
            fillSection(m_baseImag,QPoint(i,j),QSize(4,4),dominantColour(m_baseImag,QPoint(i,j),QSize(4,4)));
            }}
            
            • use QPixmap::fromImage(m_baseImag) to display the new image in another QLabel

            "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
            ~Napoleon Bonaparte

            On a crusade to banish setIndexWidget() from the holy land of Qt

            1 Reply Last reply
            1
            • P Offline
              P Offline
              Payx
              wrote on last edited by Payx
              #73

              Hello,

              I have 0 error but it didn't work.

              here my code

              void MainWindow::on_push_clicked()
              {
              	QString fileName = QFileDialog::getOpenFileName(this,
              	tr("Open Image"), "/", tr("Image Files (*.png *.jpg *.bmp)"));
              	QPixmap pix(fileName);
              	ui->label->setPixmap(pix);
              	const QSize s = pix.size();
              	QImage pixi = QImage(pix.toImage());
              
              	
              
              }
              
              void MainWindow::on_push2_clicked()
              {
              	QPoint point(0,0);
              	QSize size(4,4);
              	for(int i=0;i<pixi.width();i+=4){
              		for(int j=0;j<pixi.height();j+=4){
              			fillSection(pixi,point,size,dominantColor(pixi,point,size));
              		}
              	}
              
              	QPixmap pixa=QPixmap::fromImage(pixi);
              
              	ui->label_2->setPixmap(pixa);
              }
              

              In my .h i declared

              private:
                 Ui::MainWindow *ui;
                 QImage pixi;
              

              pixi is the name of my picture (= m_baseImag)

              i display pixa (Qpix from pixi) in the same label as pixi (dont know if i can do that)

              1 Reply Last reply
              0
              • mrjjM Offline
                mrjjM Offline
                mrjj
                Lifetime Qt Champion
                wrote on last edited by
                #74

                Hi
                Good work.
                in here
                void MainWindow::on_push_clicked()
                {
                ......
                QImage pixi = QImage(pix.toImage()); // This looks like a local variable? ( die by scope)
                }

                Did you mean to use the one from .H ?

                so
                pixi = QImage(pix.toImage());

                1 Reply Last reply
                1
                • P Offline
                  P Offline
                  Payx
                  wrote on last edited by
                  #75

                  i changed my code by using pixi = QImage(pix.toImage());

                  and in my .h i got QImage pixi.

                  I try to fix my rectSize to 15x15

                  And my picture at the end is the same, she changed a little (she got a blue pixel in the top left

                  1 Reply Last reply
                  0
                  • VRoninV Offline
                    VRoninV Offline
                    VRonin
                    wrote on last edited by
                    #76

                    you never update point in your loop. it's always 0,0 it should be i,j

                    "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                    ~Napoleon Bonaparte

                    On a crusade to banish setIndexWidget() from the holy land of Qt

                    P 1 Reply Last reply
                    2
                    • VRoninV VRonin

                      you never update point in your loop. it's always 0,0 it should be i,j

                      P Offline
                      P Offline
                      Payx
                      wrote on last edited by Payx
                      #77
                      This post is deleted!
                      1 Reply Last reply
                      0
                      • P Offline
                        P Offline
                        Payx
                        wrote on last edited by
                        #78

                        Ok after long hours, i fixed it.

                        Thank you very much for your time in my project.

                        But i have a little question :

                        In the code it only returns Red, Blue or Green.

                        Do you have a function who return a lot of color, like if in my rect the most principal color is grey (for example) what could i do to add a lot of color ?

                        At the end i will have a picture more pixelated but that i can recognize

                        kshegunovK 1 Reply Last reply
                        0
                        • mrjjM Offline
                          mrjjM Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on last edited by
                          #79

                          Hi

                          • if in my rect the most principal color is grey

                          That is just values for R,G,B. still.

                          1 Reply Last reply
                          1
                          • VRoninV Offline
                            VRoninV Offline
                            VRonin
                            wrote on last edited by VRonin
                            #80

                            Modify dominantColour with this one. It takes the most frequent colour that appears in the square and fills it with it

                            QColor dominantColour(const QImage& image,const QPoint& topLeft, const QSize& rectSize){
                            	const int maxRight = qMin(image.width(),topLeft.x() + rectSize.width());
                            	const int maxBottom = qMin(image.height(),topLeft.y() + rectSize.height());
                            	QHash<QColor,int> colourMap;
                            	for(int x=topLeft.x();x<maxRight;++x){
                            		for(int y=topLeft.y();y<maxBottom;++y){
                            			const QColor tempColor=image.pixelColor(x,y);
                            			auto colourIter=colourMap.find(tempColor);
                            			if(colourIter==colourMap.end())
                            				colourMap.insert(tempColor,1);
                            			else
                            				colourIter.value()++;
                            		}
                            	}
                            	if(colourMap.isEmpty())
                            		return Qt::black;
                            	return std::max_element(colourMap.constBegin(),colourMap.constEnd()).key();
                            }
                            

                            "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                            ~Napoleon Bonaparte

                            On a crusade to banish setIndexWidget() from the holy land of Qt

                            1 Reply Last reply
                            1
                            • P Payx

                              Ok after long hours, i fixed it.

                              Thank you very much for your time in my project.

                              But i have a little question :

                              In the code it only returns Red, Blue or Green.

                              Do you have a function who return a lot of color, like if in my rect the most principal color is grey (for example) what could i do to add a lot of color ?

                              At the end i will have a picture more pixelated but that i can recognize

                              kshegunovK Offline
                              kshegunovK Offline
                              kshegunov
                              Moderators
                              wrote on last edited by
                              #81

                              I suggest you average the color in the rectangle, e.g. (thanks to @VRonin for the scaffolding):

                              QColor dominantColour(const QImage & image,const QPoint & topLeft, const QSize & rectSize)
                              {
                                  qint32 averageRed = 0, averageGreen = 0, averageBlue = 0;
                              
                                  const qint32 maxX = qMin<qint32>(image.width(), topLeft.x() + rectSize.width());
                                  const qint32 maxY = qMin<qint32>(image.height(), topLeft.y() + rectSize.height());
                                  for (qint32 y = topLeft.y(); y < maxY; y++)  {
                                      for (qint32 x = topLeft.x(); x < maxX; x++)   {
                                          QRgb pixel = image.pixel(x, y);
                                          
                                          averageRed += qRed(pixel);
                                          averageGreen += qGreen(pixel);
                                          averageBlue += qBlue(pixel);
                                      }
                                  }
                              
                                  qint32 n = rectSize.width() * rectSize.height();
                              
                                  Q_ASSERT(n);
                                  if (n <= 0)
                                      return Qt::black;
                              
                                  return QColor(averageRed / n, averageGreen / n, averageBlue / n);
                              }
                              

                              Read and abide by the Qt Code of Conduct

                              1 Reply Last reply
                              1
                              • P Offline
                                P Offline
                                Payx
                                wrote on last edited by
                                #82

                                Thank you very much !

                                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