3

ラバーバンドを使用して画像の領域を選択し、ラバーバンドの外側の画像の部分を削除して新しい画像を表示できるようにしたいと思います。しかし、私が現在それをしているとき、それは正しい領域をトリミングせず、私に間違った画像を与えます。

#include "mainresizewindow.h"
#include "ui_mainresizewindow.h"

QString fileName;

MainResizeWindow::MainResizeWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainResizeWindow)
{
    ui->setupUi(this);
    ui->imageLabel->setScaledContents(true);
    connect(ui->actionOpen, SIGNAL(triggered()), 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();
}

助けていただければ幸いです。

4

1 に答える 1

1

ここには2つの問題があります。画像に対する四角形の位置と、画像がラベルで(潜在的に)拡大縮小されているという事実です。

位置の問題:

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

おそらくこれを次のように変更する必要があります。

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

a = ui->imageLabel->mapFromGlobal(a);
b = ui->imageLabel->mapFromGlobal(b);

次に、setScaledContents()を使用したため、ラベルが画像を拡大縮小している可能性があります。したがって、拡大縮小されていない画像の実際の座標を計算する必要があります。このようなものは多分(テストされていない/コンパイルされていない):

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;
a.x = int(a.x * sx);
b.x = int(b.x * sx);
a.y = int(a.y * sy);
b.y = int(b.y * sy);

QRect myRect(a, b);
...
于 2012-08-09T11:48:49.250 に答える