Solved Picture
-
I did not say you were done, just that you were on the right path.
from the code you posted it's clear you did not grasp scoping 100% so i'll repost the link: http://www.cplusplus.com/doc/tutorial/namespaces/#scopes
pix
andpixi
die as soon asMainWindow::on_push_clicked()
terminates -
@VRonin Yes but in my .h i add QImage pixi thats not correct?
-
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
-
-
@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
-
@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 ?
-
Ok, this has become too chatty, let's make it more structured before we both get banned.
- Put
dominantColor
andfillSection
code from either me or @mrjj at the top of your .cpp file, just below the#include
s no need to declare them in advance in this case - in the
private:
section of your .h file addQImage m_baseImag;
- in on_push_clicked load the image from file and store it in
m_baseImag
then useQPixmap::fromImage(m_baseImag)
to display the image in theQLabel
- 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 anotherQLabel
- Put
-
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)
-
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()); -
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
-
you never update point in your loop. it's always 0,0 it should be i,j
-
This post is deleted! -
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
-
Hi
- if in my rect the most principal color is grey
That is just values for R,G,B. still.
-
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(); }
-
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); }
-
Thank you very much !