How to include .txt on Qt
-
Yes but if i create a label in my UI the picture will just be displayed in the same label no ?
@Payx said in How to include .txt on Qt:
a label in my UI the picture will just be displayed in the same label no ?
Yes. You can add more than one label if u need more pics to be shown at same time.
-
my funtion is
void Remplissage(QImage& image, const QPoint& topLeft, const QSize& rectangle, const QColor& colour) { int maxX = topLeft.x() + rectangle.width(); int maxY = topLeft.y() + rectangle.height(); for(int x = topLeft.x(); x < maxX; ++x) { for(int y = topLeft.y(); y < maxY; ++y) {in
Remplissage(pixi, QPoint(i, j), QSize(z, z), Couleurdominante(pixi, QPoint(i, j), QSize(z, z)));so it depends on my z, if i say that my z = 20; and if my picture is 540 * 540 i will need 729 labels lol.
example :
here my previous code : http://hpics.li/36d1f82
my picture is 128 * 128, if my z = 28; it appears 4 colors by 4 colors.
How can i display a picture by color without add 10000 labels, thats why i though that create a label in my loop will work
-
Create a new image and put it into a secondary QLabel.
-
label is not obligatory, it's just me with my few knowlegde that i said i can use labels.
but the problem is that i have to replace the color by the picture (replace or add) and its here that i'm blocked
-
i changed a lot in my code with research :
(.Cpp)
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QPixmap> #include <QImage> #include <QFileDialog> #include <QColor> #include <QPoint> #include <QSize> #include <iostream> #include <QMapIterator> #include <QMap> #include <QDebug> #include <QGraphicsItem> #include <QGraphicsScene> using namespace std; // forwards QColor Couleurdominante(const QImage& image, const QPoint& topLeft, const QSize& rectSize); void Remplissage(QImage& image, const QPoint& topLeft, const QSize& rectSize, const QColor& colour); bool IsCloseColor( QColor c1, QColor c2 ); void Remplacement (const QColor& colour, const QPoint& topLeft, QImage& image); //----------------------------------------------------- QMap<QRgb, CostInfo > Costs = { { QColor(255 , 0 , 0 ).rgb(), { ":/img/fraise.png", 10 }}, { QColor(0 , 255 , 0 ).rgb(), { ":/img/balleverte.png", 20 }}, { QColor(0 , 0 , 255 ).rgb(), { ":/img/ballebleue.png", 20 }}, { QColor(255 , 255 , 255 ).rgb(), { ":/img/balleblanche.png", 20 }}, { QColor(255 , 128 , 0 ).rgb(), { ":/img/ballepeche.png", 20 }}, { QColor(0 , 0 , 0 ).rgb(), { ":/img/noir.png", 20 }}, { QColor(102 , 51 , 0 ).rgb(), { ":/img/marron.png", 20 }}, { QColor(255 , 102 , 78 ).rgb(), { ":/img/rose.png", 20 }}, { QColor(0 , 204 , 204 ).rgb(), { ":/img/turquoise.png", 20 }}, { QColor(255 , 178 , 102 ).rgb(), { ":/img/beige.png", 20 }}, { QColor(76 , 0 , 153 ).rgb(), { ":/img/violet.png", 20 }}, { QColor(100 , 100 , 100 ).rgb(), { ":/img/gris.png", 20 }}, }; //----------------------------------------------------- MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } //----------------------------------------------------- MainWindow::~MainWindow() { delete ui; } //----------------------------------------------------- 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); ui->label->setFixedHeight(pix.height()); ui->label->setFixedWidth(pix.width()); const QSize s = pix.size(); pixi = QImage(pix.toImage()); ui->label_2->setText( "Size: " + QString::number(s.width()) + " " + QString::number(s.height()) ); } //----------------------------------------------------- void MainWindow::on_push2_clicked() { int z = 20 ; for (int i = 0; i < pixi.width(); i += z) { for (int j = 0; j < pixi.height(); j += z) { Remplissage(pixi, QPoint(i, j), QSize(z, z), Couleurdominante(pixi, QPoint(i, j), QSize(z, z))); Remplacement(Couleurdominante(pixi, QPoint(i, j), QSize(z, z)), QPoint(i,j),pixi ); } } pixa = QPixmap::fromImage(pixi); ui->label_3->setPixmap(pixa); ui->label_3->setFixedHeight(pixa.height()); ui->label_3->setFixedWidth(pixa.width()); } //----------------------------------------------------- void Remplissage(QImage& image, const QPoint& topLeft, const QSize& rectangle, const QColor& colour) { int maxX = topLeft.x() + rectangle.width(); int maxY = topLeft.y() + rectangle.height(); for(int x = topLeft.x(); x < maxX; ++x) { for(int y = topLeft.y(); y < maxY; ++y) { image.setPixelColor(x, y, colour); }}} //----------------------------------------------------- QColor Couleurdominante(const QImage& image, const QPoint& topLeft, const QSize& rectangle) { int rouge = 0, vert = 0, bleue = 0; int X = topLeft.x() + rectangle.width(); int Y = topLeft.y() + rectangle.height(); for (int y = topLeft.y(); y < Y; y++) { for (int x = topLeft.x(); x < X; x++) { QRgb pixel = image.pixel(x, y); rouge += qRed(pixel); vert += qGreen(pixel); bleue += qBlue(pixel); } } int n = rectangle.width() * rectangle.height(); Q_ASSERT(n); if (n <= 0) return Qt::black; return QColor(rouge / n, vert / n, bleue / n); } //----------------------------------------------------- bool IsCloseColor( QColor c1, QColor c2 ) { int diffRed = abs(c1.red() - c2.red()); int diffGreen = abs(c1.green() - c2.green()); int diffBlue = abs(c1.blue() - c2.blue()); if (diffBlue + diffRed + diffGreen < 350) { return true; } else { return false; } } //----------------------------------------------------- void MainWindow::on_verticalSlider_sliderMoved(int position) { } void Remplacement (const QColor& colour, const QPoint& topLeft, QImage& image){ if (Costs.contains( colour.rgb() )) { CostInfo& ci = Costs[colour.rgb()]; // int Cost = ci.Cost; qDebug() << "check me--->" << ci.ImageName; QPixmap pix( ci.ImageName ); if (pix.isNull()){ qDebug() << "nothing"; return; }; QPixmap scaledPix = pix.scaled( 20, 20, Qt::KeepAspectRatio, Qt::SmoothTransformation ); QGraphicsPixmapItem *item = new QGraphicsPixmapItem(scaledPix); scene.addItem(item); item->setPos(topLeft.x() , topLeft.y()); } else { foreach( QRgb key, Costs.keys() ) { QColor BaseColor( key ); if (IsCloseColor(BaseColor, colour) == true){ if ( Costs.contains( BaseColor.rgb())){ qDebug () << "its OK with base color"; }else{ qDebug () << " base color had no match!!"; } CostInfo& ci = Costs[BaseColor.rgb()]; QPixmap pix( ci.ImageName ); qDebug() << "image i get from ci.ImageName : " << ci.ImageName; QPixmap scaledPix = pix.scaled( 20, 20, Qt::KeepAspectRatio, Qt::SmoothTransformation ); QGraphicsPixmapItem *item = new QGraphicsPixmapItem(scaledPix); scene.addItem(item); item->setPos(topLeft.x() , topLeft.y()); } else { qDebug() << "yep its no good"; } } } }i find a method for display my image or pix (i think) but i'm blocked with the scene ... tell me if i'm in the right direction
-
yes each cell is an image.
on the picture that you showed there is 16 cell so 16 picture who depend on the color
Edit : we had before "image.setPixelColor(x, y, colour);"
can't we have like image.'setImage' or something?
@Payx
this is what I think before
I think we can make a method likesetImageby scaling the origin image and then set the pixel according to the image that is readand I'll read your code
by the way, can you modify your indentation? I find it's hard to read your code with too many tabs, I need to scroll from left to right. -
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QPixmap> #include <QImage> #include <QFileDialog> #include <QColor> #include <QPoint> #include <QSize> #include <iostream> #include <QMapIterator> #include <QMap> #include <QDebug> #include <QGraphicsItem> #include <QGraphicsScene> using namespace std; // forwards QColor Couleurdominante(const QImage& image, const QPoint& topLeft, const QSize& rectSize); void Remplissage(QImage& image, const QPoint& topLeft, const QSize& rectSize, const QColor& colour); bool IsCloseColor( QColor c1, QColor c2 ); void Remplacement (const QColor& colour, const QPoint& topLeft, QImage& image); QGraphicsScene scene; //----------------------------------------------------- QMap<QRgb, CostInfo > Costs = { { QColor(255 , 0 , 0 ).rgb(), { ":/img/fraise.png", 10 }}, { QColor(0 , 255 , 0 ).rgb(), { ":/img/balleverte.png", 20 }}, { QColor(0 , 0 , 255 ).rgb(), { ":/img/ballebleue.png", 20 }}, { QColor(255 , 255 , 255 ).rgb(), { ":/img/balleblanche.png", 20 }}, { QColor(255 , 128 , 0 ).rgb(), { ":/img/ballepeche.png", 20 }}, { QColor(0 , 0 , 0 ).rgb(), { ":/img/noir.png", 20 }}, { QColor(102 , 51 , 0 ).rgb(), { ":/img/marron.png", 20 }}, { QColor(255 , 102 , 78 ).rgb(), { ":/img/rose.png", 20 }}, { QColor(0 , 204 , 204 ).rgb(), { ":/img/turquoise.png", 20 }}, { QColor(255 , 178 , 102 ).rgb(), { ":/img/beige.png", 20 }}, { QColor(76 , 0 , 153 ).rgb(), { ":/img/violet.png", 20 }}, { QColor(100 , 100 , 100 ).rgb(), { ":/img/gris.png", 20 }}, }; //----------------------------------------------------- MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } //----------------------------------------------------- MainWindow::~MainWindow() { delete ui; } //----------------------------------------------------- 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); ui->label->setFixedHeight(pix.height()); ui->label->setFixedWidth(pix.width()); const QSize s = pix.size(); pixi = QImage(pix.toImage()); ui->label_2->setText( "Size: " + QString::number(s.width()) + " " + QString::number(s.height()) ); } //----------------------------------------------------- void MainWindow::on_push2_clicked() { int z = 20 ; for (int i = 0; i < pixi.width(); i += z) { for (int j = 0; j < pixi.height(); j += z) { Remplissage(pixi, QPoint(i, j), QSize(z, z), Couleurdominante(pixi, QPoint(i, j), QSize(z, z))); Remplacement(Couleurdominante(pixi, QPoint(i, j), QSize(z, z)), QPoint(i,j),pixi ); } } pixa = QPixmap::fromImage(pixi); ui->label_3->setPixmap(pixa); ui->label_3->setFixedHeight(pixa.height()); ui->label_3->setFixedWidth(pixa.width()); } //----------------------------------------------------- void Remplissage(QImage& image, const QPoint& topLeft, const QSize& rectangle, const QColor& colour) { int maxX = topLeft.x() + rectangle.width(); int maxY = topLeft.y() + rectangle.height(); for(int x = topLeft.x(); x < maxX; ++x) { for(int y = topLeft.y(); y < maxY; ++y) { image.setPixelColor(x, y, colour); }}} //----------------------------------------------------- QColor Couleurdominante(const QImage& image, const QPoint& topLeft, const QSize& rectangle) { int rouge = 0, vert = 0, bleue = 0; int X = topLeft.x() + rectangle.width(); int Y = topLeft.y() + rectangle.height(); for (int y = topLeft.y(); y < Y; y++) { for (int x = topLeft.x(); x < X; x++) { QRgb pixel = image.pixel(x, y); rouge += qRed(pixel); vert += qGreen(pixel); bleue += qBlue(pixel); } } int n = rectangle.width() * rectangle.height(); Q_ASSERT(n); if (n <= 0) return Qt::black; return QColor(rouge / n, vert / n, bleue / n); } //----------------------------------------------------- bool IsCloseColor( QColor c1, QColor c2 ) { int diffRed = abs(c1.red() - c2.red()); int diffGreen = abs(c1.green() - c2.green()); int diffBlue = abs(c1.blue() - c2.blue()); if (diffBlue + diffRed + diffGreen < 350) { return true; } else { return false; } } //----------------------------------------------------- void MainWindow::on_verticalSlider_sliderMoved(int position) { } void Remplacement (const QColor& colour, const QPoint& topLeft, QImage& image){ if (Costs.contains( colour.rgb() )) { CostInfo& ci = Costs[colour.rgb()]; // int Cost = ci.Cost; qDebug() << "check me--->" << ci.ImageName; QPixmap pix( ci.ImageName ); if (pix.isNull()){ qDebug() << "nothing"; return; }; QPixmap scaledPix = pix.scaled( 20, 20, Qt::KeepAspectRatio, Qt::SmoothTransformation ); QGraphicsPixmapItem *item = new QGraphicsPixmapItem(scaledPix); scene.addItem(item); item->setPos(topLeft.x() , topLeft.y()); } else { foreach( QRgb key, Costs.keys() ) { QColor BaseColor( key ); if (IsCloseColor(BaseColor, colour) == true){ if ( Costs.contains( BaseColor.rgb())){ qDebug () << "its OK with base color"; }else{ qDebug () << " base color had no match!!"; } CostInfo& ci = Costs[BaseColor.rgb()]; QPixmap pix( ci.ImageName ); qDebug() << "image i get from ci.ImageName : " << ci.ImageName; QPixmap scaledPix = pix.scaled( 20, 20, Qt::KeepAspectRatio, Qt::SmoothTransformation ); QGraphicsPixmapItem *item = new QGraphicsPixmapItem(scaledPix); scene.addItem(item); item->setPos(topLeft.x() , topLeft.y()); } else { qDebug() << "yep its no good"; } } } }here my code.
My original image is already scaled with
for (int i = 0; i < pixi.width(); i += z) { for (int j = 0; j < pixi.height(); j += z) {so i just add one function to replace rectangle of color by the picture who correspond to this color
-
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QPixmap> #include <QImage> #include <QFileDialog> #include <QColor> #include <QPoint> #include <QSize> #include <iostream> #include <QMapIterator> #include <QMap> #include <QDebug> #include <QGraphicsItem> #include <QGraphicsScene> using namespace std; // forwards QColor Couleurdominante(const QImage& image, const QPoint& topLeft, const QSize& rectSize); void Remplissage(QImage& image, const QPoint& topLeft, const QSize& rectSize, const QColor& colour); bool IsCloseColor( QColor c1, QColor c2 ); void Remplacement (const QColor& colour, const QPoint& topLeft, QImage& image); QGraphicsScene scene; //----------------------------------------------------- QMap<QRgb, CostInfo > Costs = { { QColor(255 , 0 , 0 ).rgb(), { ":/img/fraise.png", 10 }}, { QColor(0 , 255 , 0 ).rgb(), { ":/img/balleverte.png", 20 }}, { QColor(0 , 0 , 255 ).rgb(), { ":/img/ballebleue.png", 20 }}, { QColor(255 , 255 , 255 ).rgb(), { ":/img/balleblanche.png", 20 }}, { QColor(255 , 128 , 0 ).rgb(), { ":/img/ballepeche.png", 20 }}, { QColor(0 , 0 , 0 ).rgb(), { ":/img/noir.png", 20 }}, { QColor(102 , 51 , 0 ).rgb(), { ":/img/marron.png", 20 }}, { QColor(255 , 102 , 78 ).rgb(), { ":/img/rose.png", 20 }}, { QColor(0 , 204 , 204 ).rgb(), { ":/img/turquoise.png", 20 }}, { QColor(255 , 178 , 102 ).rgb(), { ":/img/beige.png", 20 }}, { QColor(76 , 0 , 153 ).rgb(), { ":/img/violet.png", 20 }}, { QColor(100 , 100 , 100 ).rgb(), { ":/img/gris.png", 20 }}, }; //----------------------------------------------------- MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } //----------------------------------------------------- MainWindow::~MainWindow() { delete ui; } //----------------------------------------------------- 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); ui->label->setFixedHeight(pix.height()); ui->label->setFixedWidth(pix.width()); const QSize s = pix.size(); pixi = QImage(pix.toImage()); ui->label_2->setText( "Size: " + QString::number(s.width()) + " " + QString::number(s.height()) ); } //----------------------------------------------------- void MainWindow::on_push2_clicked() { int z = 20 ; for (int i = 0; i < pixi.width(); i += z) { for (int j = 0; j < pixi.height(); j += z) { Remplissage(pixi, QPoint(i, j), QSize(z, z), Couleurdominante(pixi, QPoint(i, j), QSize(z, z))); Remplacement(Couleurdominante(pixi, QPoint(i, j), QSize(z, z)), QPoint(i,j),pixi ); } } pixa = QPixmap::fromImage(pixi); ui->label_3->setPixmap(pixa); ui->label_3->setFixedHeight(pixa.height()); ui->label_3->setFixedWidth(pixa.width()); } //----------------------------------------------------- void Remplissage(QImage& image, const QPoint& topLeft, const QSize& rectangle, const QColor& colour) { int maxX = topLeft.x() + rectangle.width(); int maxY = topLeft.y() + rectangle.height(); for(int x = topLeft.x(); x < maxX; ++x) { for(int y = topLeft.y(); y < maxY; ++y) { image.setPixelColor(x, y, colour); }}} //----------------------------------------------------- QColor Couleurdominante(const QImage& image, const QPoint& topLeft, const QSize& rectangle) { int rouge = 0, vert = 0, bleue = 0; int X = topLeft.x() + rectangle.width(); int Y = topLeft.y() + rectangle.height(); for (int y = topLeft.y(); y < Y; y++) { for (int x = topLeft.x(); x < X; x++) { QRgb pixel = image.pixel(x, y); rouge += qRed(pixel); vert += qGreen(pixel); bleue += qBlue(pixel); } } int n = rectangle.width() * rectangle.height(); Q_ASSERT(n); if (n <= 0) return Qt::black; return QColor(rouge / n, vert / n, bleue / n); } //----------------------------------------------------- bool IsCloseColor( QColor c1, QColor c2 ) { int diffRed = abs(c1.red() - c2.red()); int diffGreen = abs(c1.green() - c2.green()); int diffBlue = abs(c1.blue() - c2.blue()); if (diffBlue + diffRed + diffGreen < 350) { return true; } else { return false; } } //----------------------------------------------------- void MainWindow::on_verticalSlider_sliderMoved(int position) { } void Remplacement (const QColor& colour, const QPoint& topLeft, QImage& image){ if (Costs.contains( colour.rgb() )) { CostInfo& ci = Costs[colour.rgb()]; // int Cost = ci.Cost; qDebug() << "check me--->" << ci.ImageName; QPixmap pix( ci.ImageName ); if (pix.isNull()){ qDebug() << "nothing"; return; }; QPixmap scaledPix = pix.scaled( 20, 20, Qt::KeepAspectRatio, Qt::SmoothTransformation ); QGraphicsPixmapItem *item = new QGraphicsPixmapItem(scaledPix); scene.addItem(item); item->setPos(topLeft.x() , topLeft.y()); } else { foreach( QRgb key, Costs.keys() ) { QColor BaseColor( key ); if (IsCloseColor(BaseColor, colour) == true){ if ( Costs.contains( BaseColor.rgb())){ qDebug () << "its OK with base color"; }else{ qDebug () << " base color had no match!!"; } CostInfo& ci = Costs[BaseColor.rgb()]; QPixmap pix( ci.ImageName ); qDebug() << "image i get from ci.ImageName : " << ci.ImageName; QPixmap scaledPix = pix.scaled( 20, 20, Qt::KeepAspectRatio, Qt::SmoothTransformation ); QGraphicsPixmapItem *item = new QGraphicsPixmapItem(scaledPix); scene.addItem(item); item->setPos(topLeft.x() , topLeft.y()); } else { qDebug() << "yep its no good"; } } } }here my code.
My original image is already scaled with
for (int i = 0; i < pixi.width(); i += z) { for (int j = 0; j < pixi.height(); j += z) {so i just add one function to replace rectangle of color by the picture who correspond to this color
@Payx
so where is thescene? I don't find any declaration.
and I don't find a way to convert aQGraphicsSceneto aQImageI have two directions
- if you want to use the
QGraphicsScene, then you don't need to convert it into a image. just use the scene to show your image, and you can read Graphics View Framework to see how to use it. - just copy the
scaledPixpixel by pixel to the image
- if you want to use the
-
i put my .h to see where i declared my scene
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QPixmap> #include <QPoint> #include <QSize> #include <iostream> #include <QMapIterator> #include <QMap> #include <QDebug> #include <QGraphicsItem> #include <QGraphicsScene> namespace Ui { class MainWindow; } struct CostInfo { QString ImageName; int Cost; }; class MainWindow : public QMainWindow { Q_OBJECT public: QPixmap pixa; explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_push_clicked(); void on_push2_clicked(); void on_verticalSlider_sliderMoved(int position); void on_verticalSlider_actionTriggered(int action); private: Ui::MainWindow *ui; QGraphicsScene scene; QImage pixi; float k; int a; int z=1; int b; }; #endif // MAINWINDOW_Hit will work?
EDIT : It compile but my widow crashed when i run it and nothing happend
-
i put my .h to see where i declared my scene
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QPixmap> #include <QPoint> #include <QSize> #include <iostream> #include <QMapIterator> #include <QMap> #include <QDebug> #include <QGraphicsItem> #include <QGraphicsScene> namespace Ui { class MainWindow; } struct CostInfo { QString ImageName; int Cost; }; class MainWindow : public QMainWindow { Q_OBJECT public: QPixmap pixa; explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_push_clicked(); void on_push2_clicked(); void on_verticalSlider_sliderMoved(int position); void on_verticalSlider_actionTriggered(int action); private: Ui::MainWindow *ui; QGraphicsScene scene; QImage pixi; float k; int a; int z=1; int b; }; #endif // MAINWINDOW_Hit will work?
EDIT : It compile but my widow crashed when i run it and nothing happend
@Payx
you can use the debug mode to find out which line of code makes it crash.and I find that you declare two
scene, one in theMainWindow, one is global, and you did not use thescenein theMainWindow. -
You can do it, click on the "Topic Tools" button, you have there the "Mark as solved" entry.
-
This post is deleted!
