- const char *ext = fileName.toStdString().c_str() + strlen(fileName.toStdString().c_str()) - 4;
- if (!strcmp(ext, ".bmp")) {
- vtkBMPWriter *bmp = vtkBMPWriter::New();
- bmp->SetInput(image);
- bmp->SetFileName(fileName.toStdString().c_str());
- bmp->Write();
- bmp->Delete();
- } else if (!strcmp(ext, ".tif")) {
- vtkTIFFWriter *tif = vtkTIFFWriter::New();
- tif->SetInput(image);
- tif->SetFileName(fileName.toStdString().c_str());
- tif->Write();
- tif->Delete();
- } else if (!strcmp(ext, ".ppm")) {
- vtkPNMWriter *pnm = vtkPNMWriter::New();
- pnm->SetInput(image);
- pnm->SetFileName(fileName.toStdString().c_str());
- pnm->Write();
- pnm->Delete();
- } else if (!strcmp(ext, ".png")) {
- vtkPNGWriter *png = vtkPNGWriter::New();
- png->SetInput(image);
- png->SetFileName(fileName.toStdString().c_str());
- png->Write();
- png->Delete();
- } else if (!strcmp(ext, ".jpg")) {
- vtkJPEGWriter *jpg = vtkJPEGWriter::New();
- jpg->SetInput(image);
- jpg->SetFileName(fileName.toStdString().c_str());
- jpg->Write();
- jpg->Delete();
- } else {
- QMessageBox::information(this,tr("Problem saving screenshot !"),tr("Cannot save image.\nPlease set a file extension !!!"));
+ vtkSmartPointer<vtkWindowToImageFilter> w2i = vtkSmartPointer<vtkWindowToImageFilter>::New();
+ w2i->SetInput(widget->GetRenderWindow());
+ w2i->Update();
+ vtkImageData *image = w2i->GetOutput();
+
+ std::string ext(itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString()));
+
+ // Image
+ vtkImageWriter *imgwriter = NULL;
+ if (ext==".bmp")
+ imgwriter = vtkBMPWriter::New();
+ else if (ext==".tif")
+ imgwriter = vtkTIFFWriter::New();
+ else if (ext==".ppm")
+ imgwriter = vtkPNMWriter::New();
+ else if (ext==".png")
+ imgwriter = vtkPNGWriter::New();
+ else if (ext==".jpg")
+ imgwriter = vtkJPEGWriter::New();
+
+ // Snapshot image if not null
+ if(imgwriter!=NULL) {
+ imgwriter->SetInput(image);
+ imgwriter->SetFileName(fileName.toStdString().c_str());
+ imgwriter->Write();
+ return;
+ }
+
+ // Video
+ vtkGenericMovieWriter *vidwriter = NULL;
+#if CLITK_EXPERIMENTAL == 1
+ if (ext==".gif") {
+ vvAnimatedGIFWriter *gif = vvAnimatedGIFWriter::New();
+ vidwriter = gif;
+
+ // FPS
+ bool ok;
+ int fps = QInputDialog::getInteger(this, tr("Number of frames per second"),
+ tr("FPS:"), 5, 0, 1000, 1, &ok);
+ if(ok)
+ gif->SetRate(fps);
+
+ // Loops
+ int loops = QInputDialog::getInteger(this, tr("Loops"),
+ tr("Number of loops (0 means infinite):"), 0, 0, 1000000000, 1, &ok);
+ if(ok)
+ gif->SetLoops(loops);
+
+ // Dithering
+ QString msg = "Would you like to activate dithering?";
+ QMessageBox msgBox(QMessageBox::Question, tr("Dithering"),msg, 0, this);
+ msgBox.addButton(tr("Yes"), QMessageBox::AcceptRole);
+ msgBox.addButton(tr("No"), QMessageBox::RejectRole);
+ gif->SetDither(msgBox.exec() == QMessageBox::AcceptRole);
+ }
+#endif
+#ifdef VTK_USE_VIDEO_FOR_WINDOWS
+ if (ext==".avi") {
+ vtkAVIWriter *mpg = vtkAVIWriter::New();
+ vidwriter = mpg;
+ mpg->SetQuality(2);
+ bool ok;
+ int fps = QInputDialog::getInteger(this, tr("Number of frames per second"),
+ tr("FPS:"), 5, 0, 1024, 1, &ok);
+ if(!ok)
+ fps = 5;
+ mpg->SetRate(fps);
+ }
+#endif
+#ifdef VTK_USE_FFMPEG_ENCODER
+ if (ext==".avi") {
+ vtkFFMPEGWriter *mpg = vtkFFMPEGWriter::New();
+ vidwriter = mpg;
+ mpg->SetQuality(2);
+ bool ok;
+ int fps = QInputDialog::getInteger(this, tr("Number of frames per second"),
+ tr("FPS:"), 5, 0, 1024, 1, &ok);
+ if(!ok)
+ fps = 5;
+ mpg->SetRate(fps);
+ mpg->SetBitRateTolerance(int(ceil(12.0*1024*1024/fps)));
+ }
+#endif
+#ifdef VTK_USE_MPEG2_ENCODER
+ if (ext==".mpg") {
+ vtkMPEG2Writer *mpg = vtkMPEG2Writer::New();
+ vidwriter = mpg;
+ }
+#endif
+
+ // Take video if not null
+ if(vidwriter!=NULL){
+ vidwriter->SetInput(image);
+ vidwriter->SetFileName(fileName.toStdString().c_str());
+ vidwriter->Start();
+ vvImage * vvImg = mSlicerManagers[smIndex]->GetImage();
+ int nSlice = vvImg->GetVTKImages().size();
+ for(int i=0; i<nSlice; i++) {
+ mSlicerManagers[smIndex]->SetNextTSlice(0);
+ vtkSmartPointer<vtkWindowToImageFilter> w2i = vtkSmartPointer<vtkWindowToImageFilter>::New();
+ w2i->SetInput(widget->GetRenderWindow());
+ w2i->Update();
+ vidwriter->SetInput(w2i->GetOutput());
+ vidwriter->Write();
+ }
+ vidwriter->End();
+ vidwriter->Delete();
+ return;