Utilisation de QRubberBand pour rogner une image dans Qt

Je veux pouvoir utiliser une bande élastique pour sélectionner une zone d’image, puis supprimer les parties de l’image en dehors de la bande élastique et afficher la nouvelle image. Cependant, quand je le fais actuellement, il ne recadre pas les zones correctes et me donne la mauvaise image.

#include "mainresizewindow.h" #include "ui_mainresizewindow.h" QSsortingng fileName; MainResizeWindow::MainResizeWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainResizeWindow) { ui->setupUi(this); ui->imageLabel->setScaledContents(true); connect(ui->actionOpen, SIGNAL(sortingggered()), this, SLOT(open())); } MainResizeWindow::~MainResizeWindow() { delete ui; } void MainResizeWindow::open() { fileName = QFileDialog::getOpenFileName(this, tr("Open File"), QDir::currentPath()); if (!fileName.isEmpty()) { QImage image(fileName); if (image.isNull()) { QMessageBox::information(this, tr("Image Viewer"), tr("Cannot load %1.").arg(fileName)); return; } ui->imageLabel->setPixmap(QPixmap::fromImage(image)); ui->imageLabel->repaint(); } } void MainResizeWindow::mousePressEvent(QMouseEvent *event) { if(ui->imageLabel->underMouse()){ myPoint = event->pos(); rubberBand = new QRubberBand(QRubberBand::Rectangle, this); rubberBand->show(); } } void MainResizeWindow::mouseMoveEvent(QMouseEvent *event) { rubberBand->setGeometry(QRect(myPoint, event->pos()).normalized()); } void MainResizeWindow::mouseReleaseEvent(QMouseEvent *event) { QRect myRect(myPoint, event->pos()); rubberBand->hide(); QPixmap OriginalPix(*ui->imageLabel->pixmap()); QImage newImage; newImage = OriginalPix.toImage(); QImage copyImage; copyImage = copyImage.copy(myRect); ui->imageLabel->setPixmap(QPixmap::fromImage(copyImage)); ui->imageLabel->repaint(); } 

Toute aide appréciée.

Il y a deux problèmes ici: la position du rect par rapport à l’image et le fait que l’image est (potentiellement) mise à l’échelle dans l’étiquette.

Problème de position:

 QRect myRect(myPoint, event->pos()); 

Vous devriez peut-être changer ceci en:

 QPoint a = mapToGlobal(myPoint); QPoint b = event->globalPos(); a = ui->imageLabel->mapFromGlobal(a); b = ui->imageLabel->mapFromGlobal(b); 

Ensuite, l’étiquette peut redimensionner l’image car vous avez utilisé setScaledContents (). Vous devez donc déterminer les coordonnées réelles sur l’image non mise à l’échelle. Quelque chose comme ceci peut-être (non testé / compilé):

 QPixmap OriginalPix(*ui->imageLabel->pixmap()); double sx = ui->imageLabel->rect().width(); double sy = ui->imageLabel->rect().height(); sx = OriginalPix.width() / sx; sy = OriginalPix.height() / sy; ax = int(ax * sx); bx = int(bx * sx); ay = int(ay * sy); by = int(by * sy); QRect myRect(a, b); ...