3 #include <QApplication>
4 #include <vtkImageClip.h>
5 #include <vtkImageTranslateExtent.h>
6 #include <vtkImageData.h>
7 #include <vtkSmartPointer.h>
8 #include "vvCropDialog.h"
9 #include "vvSlicerManager.h"
10 #include "clitkCommon.h"
12 vvCropDialog::vvCropDialog(std::vector<vvSlicerManager*> sms,int current) :
16 for (unsigned int i=0;i<mSlicerManagers.size();i++)
17 inputSequenceBox->addItem(vtksys::SystemTools::GetFilenameName(mSlicerManagers[i]->GetFileName()).c_str());
18 connect(inputSequenceBox,SIGNAL(currentIndexChanged(int)),this,SLOT(ImageChanged(int)));
19 inputSequenceBox->setCurrentIndex(current);
20 ImageChanged(current);
21 connect(this,SIGNAL(accepted()),this,SLOT(ComputeCroppedImage()));
24 void vvCropDialog::ImageChanged(int newindex)
26 std::vector<int> imsize=mSlicerManagers[newindex]->GetImage()->GetSize();
27 xminSlider->setMaximum(imsize[0]-1);
28 xmaxSlider->setMaximum(imsize[0]-1);
29 xmaxSlider->setValue(imsize[0]-1);
30 yminSlider->setMaximum(imsize[1]-1);
31 ymaxSlider->setMaximum(imsize[1]-1);
32 ymaxSlider->setValue(imsize[1]-1);
33 zminSlider->setMaximum(imsize[2]-1);
34 zmaxSlider->setMaximum(imsize[2]-1);
35 zmaxSlider->setValue(imsize[2]-1);
36 spin_xmin->setMaximum(imsize[0]-1);
37 spin_xmax->setMaximum(imsize[0]-1);
38 spin_xmax->setValue(imsize[0]-1);
39 spin_ymin->setMaximum(imsize[1]-1);
40 spin_ymax->setMaximum(imsize[1]-1);
41 spin_ymax->setValue(imsize[1]-1);
42 spin_zmin->setMaximum(imsize[2]-1);
43 spin_zmax->setMaximum(imsize[2]-1);
44 spin_zmax->setValue(imsize[2]-1);
47 void vvCropDialog::ComputeCroppedImage()
49 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
50 mResult=vvImage::New();
51 vvSlicerManager * current=mSlicerManagers[inputSequenceBox->currentIndex()];
52 vvImage::Pointer image=current->GetImage();
53 for (std::vector<vtkImageData*>::const_iterator i=image->GetVTKImages().begin();
54 i!=image->GetVTKImages().end();i++)
56 vtkSmartPointer<vtkImageClip> filter=vtkSmartPointer<vtkImageClip>::New();
57 ///Vtk is very weird, you need to "translate the extent" to get the correct origin
58 //http://markmail.org/message/vndc2tr6kcabiakp#query:vtkImageClip%20origin+page:1+mid:6na7y57floutklvz+state:results
59 vtkSmartPointer<vtkImageTranslateExtent> translate=vtkSmartPointer<vtkImageTranslateExtent>::New();
61 filter->SetOutputWholeExtent(xminSlider->value(),xmaxSlider->value(),
62 yminSlider->value(),ymaxSlider->value(),
63 zminSlider->value(),zmaxSlider->value());
64 translate->SetTranslation(-xminSlider->value(),-yminSlider->value(),-zminSlider->value());
65 translate->SetInput(filter->GetOutput());
66 filter->ClipDataOn(); //Really create a cropped copy of the image
68 vtkImageData* output=vtkImageData::New();
69 output->ShallowCopy(translate->GetOutput());
70 mResult->AddImage(output);
72 QApplication::restoreOverrideCursor();