2012-08-09 2 views
3

고무 밴드를 사용하여 이미지 영역을 선택한 다음 고무 밴드 바깥 쪽의 이미지 부분을 제거하고 새 이미지를 표시 할 수 있기를 원합니다. 그러나 내가 현재 그것을 할 때, 그것은 정확한 지역을 자르지 않고 나에게 틀린 이미지를 준다.QRubberBand를 사용하여 Qt에서 이미지 자르기

#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(); 
} 

도움을 주시면 감사하겠습니다.

+1

'myRect'는'copyImage' 좌표가 아닌'MainResizeWindow' 좌표에 있습니다. 좌표 값을 확인하십시오. – cmannett85

답변

1

여기에는 두 가지 문제가 있습니다. 즉, 이미지와 관련된 직사각형의 위치와 레이블에서 이미지가 (잠재적으로) 크기가 조정된다는 사실입니다.

위치 문제 :

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

당신은 아마로 변경한다 : 당신이 setScaledContents을 사용했기 때문에

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

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

그런 다음, 라벨 이미지를 확장 할 수있다(). 따라서 스케일이 조정되지 않은 이미지의 실제 좌표를 계산해야합니다. 다음과 같은 것 : (테스트되지 않았거나 컴파일 된)

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); 
... 
+0

대단히 감사합니다! 그것은 효과가있다! – user1576633