diff --git a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.cpp b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.cpp index 19b57e2058..f53d60f60d 100644 --- a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.cpp +++ b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.cpp @@ -1,428 +1,495 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkScreenshotMaker.h" //#include "QmitkMovieMakerControls.h" #include "QmitkStepperAdapter.h" #include "mitkVtkPropRenderer.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "qapplication.h" #include "vtkImageWriter.h" #include "vtkJPEGWriter.h" #include "vtkPNGWriter.h" #include "vtkRenderLargeImage.h" #include "vtkRenderWindowInteractor.h" #include "vtkRenderer.h" #include "vtkTestUtilities.h" #include #include "vtkMitkRenderProp.h" #include #include #include "vtkRenderWindowInteractor.h" #include #include "mitkSliceNavigationController.h" #include "mitkPlanarFigure.h" #include +#include +#include QmitkScreenshotMaker::QmitkScreenshotMaker(QObject *parent, const char * /*name*/) : QmitkAbstractView(), m_Controls(nullptr), m_BackgroundColor(QColor(0,0,0)), m_SelectedNode(0) { parentWidget = parent; } QmitkScreenshotMaker::~QmitkScreenshotMaker() { } void QmitkScreenshotMaker::CreateConnections() { - if (m_Controls) - { - connect((QObject*) m_Controls->m_AllViews, SIGNAL(clicked()), (QObject*) this, SLOT(GenerateMultiplanar3DHighresScreenshot())); - connect((QObject*) m_Controls->m_Shot, SIGNAL(clicked()), (QObject*) this, SLOT(GenerateMultiplanarScreenshots())); - connect((QObject*) m_Controls->m_BackgroundColor, SIGNAL(clicked()), (QObject*) this, SLOT(SelectBackgroundColor())); - connect((QObject*) m_Controls->btnScreenshot, SIGNAL(clicked()), this, SLOT(GenerateScreenshot())); - connect((QObject*) m_Controls->m_HRScreenshot, SIGNAL(clicked()), this, SLOT(Generate3DHighresScreenshot())); - - QString styleSheet = "background-color:rgb(0,0,0)"; - m_Controls->m_BackgroundColor->setStyleSheet(styleSheet); - } + if (m_Controls) + { + connect((QObject*) m_Controls->m_AllViews, SIGNAL(clicked()), (QObject*) this, SLOT(GenerateMultiplanar3DHighresScreenshot())); + connect((QObject*) m_Controls->m_Shot, SIGNAL(clicked()), (QObject*) this, SLOT(GenerateMultiplanarScreenshots())); + connect((QObject*) m_Controls->m_BackgroundColor, SIGNAL(clicked()), (QObject*) this, SLOT(SelectBackgroundColor())); + connect((QObject*) m_Controls->btnScreenshot, SIGNAL(clicked()), this, SLOT(GenerateScreenshot())); + connect((QObject*) m_Controls->m_HRScreenshot, SIGNAL(clicked()), this, SLOT(Generate3DHighresScreenshot())); + + QString styleSheet = "background-color:rgb(0,0,0)"; + m_Controls->m_BackgroundColor->setStyleSheet(styleSheet); + } } -void QmitkScreenshotMaker::GenerateScreenshot() +mitk::DataNode::Pointer QmitkScreenshotMaker::GetTopLayerNode() { - if (m_LastFile.size()==0) - m_LastFile = QDir::currentPath()+"/screenshot.png"; - - QString filter; - QString fileName = QFileDialog::getSaveFileName(nullptr, "Save screenshot to...", m_LastFile, m_PNGExtension + ";;" + m_JPGExtension, &filter); + mitk::DataNode::Pointer out = nullptr; + + int layer = -1; + auto nodes = GetDataStorage()->GetAll(); + for (auto node = nodes->begin(); node!=nodes->end(); ++node) + { + if (!(*node)->IsVisible(nullptr)) + continue; + int current_layer; + (*node)->GetIntProperty("layer", current_layer); + if (current_layer>layer) + { + out = (*node); + layer = current_layer; + } + } - if (fileName.size()>0) - m_LastFile = fileName; + return out; +} - auto renderWindowPart = this->GetRenderWindowPart(mitk::WorkbenchUtil::IRenderWindowPartStrategy::OPEN); +void QmitkScreenshotMaker::MultichannelScreenshot(mitk::VtkPropRenderer* renderer, QString fileName, QString filter) +{ + auto node = GetTopLayerNode(); + if (node.IsNotNull() && dynamic_cast(node->GetData())) + { + auto image = dynamic_cast(node->GetData()); - mitk::BaseRenderer* renderer = renderWindowPart->GetActiveQmitkRenderWindow()->GetRenderer(); - renderer = nullptr; // WORKAROUND FOR T23702 + std::string fname = itksys::SystemTools::GetFilenamePath(fileName.toStdString()) + "/" + itksys::SystemTools::GetFilenameWithoutExtension(fileName.toStdString()); + std::string ext = itksys::SystemTools::GetFilenameExtension(fileName.toStdString()); - if (renderer == nullptr) + mitk::PixelType chPixelType = image->GetImageDescriptor()->GetChannelTypeById(0); + if (image->GetDimension() == 4) { - renderer = renderWindowPart->GetQmitkRenderWindow(m_Controls->m_DirectionBox->currentText())->GetRenderer(); - if (renderer == nullptr) - return; + MITK_INFO << "LOOPING THROUGH FOURTH DIMESNION IS NOT IMPLEMENTED"; } + else if (chPixelType.GetNumberOfComponents()>1) + { + for(int unsigned c=0; cSetProperty("Image.Displayed Component", mitk::IntProperty::New(c)); + this->TakeScreenshot(renderer->GetVtkRenderer(), 1, QString(fname.c_str()) + "_" + QString::number(c) + QString(ext.c_str()), filter); + } + } + else + this->TakeScreenshot(renderer->GetVtkRenderer(), 1, fileName, filter); + } + else this->TakeScreenshot(renderer->GetVtkRenderer(), 1, fileName, filter); } -void QmitkScreenshotMaker::GenerateMultiplanarScreenshots() +void QmitkScreenshotMaker::GenerateScreenshot() { - if (m_LastPath.size()==0) - m_LastPath = QDir::currentPath(); - QString filePath = QFileDialog::getExistingDirectory(nullptr, "Save screenshots to...", m_LastPath); - if (filePath.size()>0) - m_LastPath = filePath; + if (m_LastFile.size()==0) + m_LastFile = QDir::currentPath()+"/screenshot.png"; - if( filePath.isEmpty() ) - { - return; - } + QString filter; + QString fileName = QFileDialog::getSaveFileName(nullptr, "Save screenshot to...", m_LastFile, m_PNGExtension + ";;" + m_JPGExtension, &filter); - //emit StartBlockControls(); - auto renderWindowPart = this->GetRenderWindowPart(mitk::WorkbenchUtil::IRenderWindowPartStrategy::OPEN); - renderWindowPart->EnableDecorations(false, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION}); + if (fileName.size()>0) + m_LastFile = fileName; - QString fileName = "/axial.png"; - int c = 1; - while (QFile::exists(filePath+fileName)) - { - fileName = QString("/axial_"); - fileName += QString::number(c); - fileName += ".png"; - c++; - } - vtkRenderer* renderer = renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderer()->GetVtkRenderer(); - if (renderer != nullptr) - this->TakeScreenshot(renderer, 1, filePath+fileName); + auto renderWindowPart = this->GetRenderWindowPart(mitk::WorkbenchUtil::IRenderWindowPartStrategy::OPEN); - fileName = "/sagittal.png"; - c = 1; - while (QFile::exists(filePath+fileName)) - { - fileName = QString("/sagittal_"); - fileName += QString::number(c); - fileName += ".png"; - c++; - } - renderer = renderWindowPart->GetQmitkRenderWindow("sagittal")->GetRenderer()->GetVtkRenderer(); - if (renderer != nullptr) - this->TakeScreenshot(renderer, 1, filePath+fileName); + auto renderer = renderWindowPart->GetQmitkRenderWindow(m_Controls->m_DirectionBox->currentText())->GetRenderer(); + if (renderer == nullptr) + return; - fileName = "/coronal.png"; - c = 1; - while (QFile::exists(filePath+fileName)) - { - fileName = QString("/coronal_"); - fileName += QString::number(c); - fileName += ".png"; - c++; - } - renderer = renderWindowPart->GetQmitkRenderWindow("coronal")->GetRenderer()->GetVtkRenderer(); - if (renderer != nullptr) - this->TakeScreenshot(renderer, 1, filePath+fileName); - - /// TODO I do not find a simple way of doing this through the render window part API, - /// however, I am also not convinced that this code is needed at all. The colour - /// of the crosshair planes is never set to any colour other than these. - /// I suggest a new 'mitk::DataNode* mitk::ILinkedRendererPart::GetSlicingPlane(const std::string& name) const' - /// function to introduce that could return the individual ("axial", "sagittal" or - /// "coronal" crosshair planes. - -// mitk::DataNode* n = renderWindowPart->GetSlicingPlane("axial"); -// if (n) -// { -// n->SetProperty( "color", mitk::ColorProperty::New( 1,0,0 ) ); -// } -// -// n = renderWindowPart->GetSlicingPlane("sagittal"); -// if (n) -// { -// n->SetProperty( "color", mitk::ColorProperty::New( 0,1,0 ) ); -// } -// -// n = renderWindowPart->GetSlicingPlane("coronal"); -// if (n) -// { -// n->SetProperty( "color", mitk::ColorProperty::New( 0,0,1 ) ); -// } - - renderWindowPart->EnableDecorations(true, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION}); + if (m_Controls->m_AllChannelsBox->isChecked()) + MultichannelScreenshot(renderer, fileName, filter); + else + this->TakeScreenshot(renderer->GetVtkRenderer(), 1, fileName, filter); +} + +void QmitkScreenshotMaker::GenerateMultiplanarScreenshots() +{ + if (m_LastPath.size()==0) + m_LastPath = QDir::currentPath(); + QString filePath = QFileDialog::getExistingDirectory(nullptr, "Save screenshots to...", m_LastPath); + if (filePath.size()>0) + m_LastPath = filePath; + + if( filePath.isEmpty() ) + { + return; + } + + //emit StartBlockControls(); + auto renderWindowPart = this->GetRenderWindowPart(mitk::WorkbenchUtil::IRenderWindowPartStrategy::OPEN); + renderWindowPart->EnableDecorations(false, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION}); + + QString fileName = "/axial.png"; + int c = 1; + while (QFile::exists(filePath+fileName)) + { + fileName = QString("/axial_"); + fileName += QString::number(c); + fileName += ".png"; + c++; + } + vtkRenderer* renderer = renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderer()->GetVtkRenderer(); + if (renderer != nullptr) + { + if (m_Controls->m_AllChannelsBox->isChecked()) + MultichannelScreenshot(renderWindowPart->GetQmitkRenderWindow("axial")->GetRenderer(), filePath+fileName, m_PNGExtension); + else + this->TakeScreenshot(renderer, 1, filePath+fileName); + } + + fileName = "/sagittal.png"; + c = 1; + while (QFile::exists(filePath+fileName)) + { + fileName = QString("/sagittal_"); + fileName += QString::number(c); + fileName += ".png"; + c++; + } + renderer = renderWindowPart->GetQmitkRenderWindow("sagittal")->GetRenderer()->GetVtkRenderer(); + if (renderer != nullptr) + { + if (m_Controls->m_AllChannelsBox->isChecked()) + MultichannelScreenshot(renderWindowPart->GetQmitkRenderWindow("sagittal")->GetRenderer(), filePath+fileName, m_PNGExtension); + else + this->TakeScreenshot(renderer, 1, filePath+fileName); + } + + fileName = "/coronal.png"; + c = 1; + while (QFile::exists(filePath+fileName)) + { + fileName = QString("/coronal_"); + fileName += QString::number(c); + fileName += ".png"; + c++; + } + renderer = renderWindowPart->GetQmitkRenderWindow("coronal")->GetRenderer()->GetVtkRenderer(); + if (renderer != nullptr) + { + if (m_Controls->m_AllChannelsBox->isChecked()) + MultichannelScreenshot(renderWindowPart->GetQmitkRenderWindow("coronal")->GetRenderer(), filePath+fileName, m_PNGExtension); + else + this->TakeScreenshot(renderer, 1, filePath+fileName); + } + + /// TODO I do not find a simple way of doing this through the render window part API, + /// however, I am also not convinced that this code is needed at all. The colour + /// of the crosshair planes is never set to any colour other than these. + /// I suggest a new 'mitk::DataNode* mitk::ILinkedRendererPart::GetSlicingPlane(const std::string& name) const' + /// function to introduce that could return the individual ("axial", "sagittal" or + /// "coronal" crosshair planes. + + // mitk::DataNode* n = renderWindowPart->GetSlicingPlane("axial"); + // if (n) + // { + // n->SetProperty( "color", mitk::ColorProperty::New( 1,0,0 ) ); + // } + // + // n = renderWindowPart->GetSlicingPlane("sagittal"); + // if (n) + // { + // n->SetProperty( "color", mitk::ColorProperty::New( 0,1,0 ) ); + // } + // + // n = renderWindowPart->GetSlicingPlane("coronal"); + // if (n) + // { + // n->SetProperty( "color", mitk::ColorProperty::New( 0,0,1 ) ); + // } + + renderWindowPart->EnableDecorations(true, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION}); } void QmitkScreenshotMaker::Generate3DHighresScreenshot() { - if (m_LastFile.size()==0) - m_LastFile = QDir::currentPath()+"/3D_screenshot.png"; + if (m_LastFile.size()==0) + m_LastFile = QDir::currentPath()+"/3D_screenshot.png"; - QString filter; - QString fileName = QFileDialog::getSaveFileName(nullptr, "Save screenshot to...", m_LastFile, m_PNGExtension + ";;" + m_JPGExtension, &filter); + QString filter; + QString fileName = QFileDialog::getSaveFileName(nullptr, "Save screenshot to...", m_LastFile, m_PNGExtension + ";;" + m_JPGExtension, &filter); - if (fileName.size()>0) - m_LastFile = fileName; - GenerateHR3DAtlasScreenshots(fileName, filter); + if (fileName.size()>0) + m_LastFile = fileName; + GenerateHR3DAtlasScreenshots(fileName, filter); - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); + mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkScreenshotMaker::GenerateMultiplanar3DHighresScreenshot() { - if (m_LastPath.size()==0) - m_LastPath = QDir::currentPath(); - QString filePath = QFileDialog::getExistingDirectory( nullptr, "Save screenshots to...", m_LastPath); - if (filePath.size()>0) - m_LastPath = filePath; - - if( filePath.isEmpty() ) - { - return; - } - - QString fileName = "/3D_View1.png"; - int c = 1; - while (QFile::exists(filePath+fileName)) - { - fileName = QString("/3D_View1_"); - fileName += QString::number(c); - fileName += ".png"; - c++; - } - GetCam()->Azimuth( -7.5 ); - GetCam()->Roll(-4); - GenerateHR3DAtlasScreenshots(filePath+fileName); - GetCam()->Roll(4); - - fileName = "/3D_View2.png"; - c = 1; - while (QFile::exists(filePath+fileName)) - { - fileName = QString("/3D_View2_"); - fileName += QString::number(c); - fileName += ".png"; - c++; - } - GetCam()->Azimuth( 90 ); - GetCam()->Elevation( 4 ); - GenerateHR3DAtlasScreenshots(filePath+fileName); - - fileName = "/3D_View3.png"; - c = 1; - while (QFile::exists(filePath+fileName)) - { - fileName = QString("/3D_View3_"); - fileName += QString::number(c); - fileName += ".png"; - c++; - } - GetCam()->Elevation( 90 ); - GetCam()->Roll( -2.5 ); - GenerateHR3DAtlasScreenshots(filePath+fileName); - - mitk::RenderingManager::GetInstance()->RequestUpdateAll(); + if (m_LastPath.size()==0) + m_LastPath = QDir::currentPath(); + QString filePath = QFileDialog::getExistingDirectory( nullptr, "Save screenshots to...", m_LastPath); + if (filePath.size()>0) + m_LastPath = filePath; + + if( filePath.isEmpty() ) + { + return; + } + + QString fileName = "/3D_View1.png"; + int c = 1; + while (QFile::exists(filePath+fileName)) + { + fileName = QString("/3D_View1_"); + fileName += QString::number(c); + fileName += ".png"; + c++; + } + GetCam()->Azimuth( -7.5 ); + GetCam()->Roll(-4); + GenerateHR3DAtlasScreenshots(filePath+fileName); + GetCam()->Roll(4); + + fileName = "/3D_View2.png"; + c = 1; + while (QFile::exists(filePath+fileName)) + { + fileName = QString("/3D_View2_"); + fileName += QString::number(c); + fileName += ".png"; + c++; + } + GetCam()->Azimuth( 90 ); + GetCam()->Elevation( 4 ); + GenerateHR3DAtlasScreenshots(filePath+fileName); + + fileName = "/3D_View3.png"; + c = 1; + while (QFile::exists(filePath+fileName)) + { + fileName = QString("/3D_View3_"); + fileName += QString::number(c); + fileName += ".png"; + c++; + } + GetCam()->Elevation( 90 ); + GetCam()->Roll( -2.5 ); + GenerateHR3DAtlasScreenshots(filePath+fileName); + + mitk::RenderingManager::GetInstance()->RequestUpdateAll(); } void QmitkScreenshotMaker::GenerateHR3DAtlasScreenshots(QString fileName, QString filter) { - // only works correctly for 3D RenderWindow - this->GetRenderWindowPart()->EnableDecorations(false, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION}); - vtkRenderer* renderer = this->GetRenderWindowPart()->GetQmitkRenderWindow("3d")->GetRenderer()->GetVtkRenderer(); - if (renderer == nullptr) - return; - this->TakeScreenshot(renderer, this->m_Controls->m_MagFactor->text().toFloat(), fileName, filter); - this->GetRenderWindowPart()->EnableDecorations(true, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION}); + // only works correctly for 3D RenderWindow + this->GetRenderWindowPart()->EnableDecorations(false, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION}); + vtkRenderer* renderer = this->GetRenderWindowPart()->GetQmitkRenderWindow("3d")->GetRenderer()->GetVtkRenderer(); + if (renderer == nullptr) + return; + this->TakeScreenshot(renderer, this->m_Controls->m_MagFactor->text().toFloat(), fileName, filter); + this->GetRenderWindowPart()->EnableDecorations(true, QStringList{mitk::IRenderWindowPart::DECORATION_CORNER_ANNOTATION}); } vtkCamera* QmitkScreenshotMaker::GetCam() { - mitk::BaseRenderer* renderer = this->GetRenderWindowPart(mitk::WorkbenchUtil::IRenderWindowPartStrategy::OPEN)->GetQmitkRenderWindow("3d")->GetRenderer(); - vtkCamera* cam = 0; - const mitk::VtkPropRenderer *propRenderer = dynamic_cast( renderer ); - if (propRenderer) + mitk::BaseRenderer* renderer = this->GetRenderWindowPart(mitk::WorkbenchUtil::IRenderWindowPartStrategy::OPEN)->GetQmitkRenderWindow("3d")->GetRenderer(); + vtkCamera* cam = 0; + const mitk::VtkPropRenderer *propRenderer = dynamic_cast( renderer ); + if (propRenderer) + { + // get vtk renderer + vtkRenderer* vtkrenderer = propRenderer->GetVtkRenderer(); + if (vtkrenderer) { - // get vtk renderer - vtkRenderer* vtkrenderer = propRenderer->GetVtkRenderer(); - if (vtkrenderer) - { - // get vtk camera - vtkCamera* vtkcam = vtkrenderer->GetActiveCamera(); - if (vtkcam) - { - // vtk smart pointer handling - cam = vtkcam; - cam->Register( nullptr ); - } - } + // get vtk camera + vtkCamera* vtkcam = vtkrenderer->GetActiveCamera(); + if (vtkcam) + { + // vtk smart pointer handling + cam = vtkcam; + cam->Register( nullptr ); + } } - return cam; + } + return cam; } void QmitkScreenshotMaker::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { - if(nodes.size()) - m_SelectedNode = nodes[0]; + if(nodes.size()) + m_SelectedNode = nodes[0]; } void QmitkScreenshotMaker::CreateQtPartControl(QWidget *parent) { - if (!m_Controls) - { - m_Parent = parent; - m_Controls = new Ui::QmitkScreenshotMakerControls; - m_Controls->setupUi(parent); + if (!m_Controls) + { + m_Parent = parent; + m_Controls = new Ui::QmitkScreenshotMakerControls; + m_Controls->setupUi(parent); - // Initialize "Selected Window" combo box - const mitk::RenderingManager::RenderWindowVector rwv = - mitk::RenderingManager::GetInstance()->GetAllRegisteredRenderWindows(); + // Initialize "Selected Window" combo box + const mitk::RenderingManager::RenderWindowVector rwv = + mitk::RenderingManager::GetInstance()->GetAllRegisteredRenderWindows(); - } + } - this->CreateConnections(); + this->CreateConnections(); } void QmitkScreenshotMaker::SetFocus() { m_Controls->btnScreenshot->setFocus(); } void QmitkScreenshotMaker::RenderWindowPartActivated(mitk::IRenderWindowPart* /*renderWindowPart*/) { - m_Parent->setEnabled(true); + m_Parent->setEnabled(true); } void QmitkScreenshotMaker::RenderWindowPartDeactivated(mitk::IRenderWindowPart* /*renderWindowPart*/) { - m_Parent->setEnabled(false); + m_Parent->setEnabled(false); } void QmitkScreenshotMaker::TakeScreenshot(vtkRenderer* renderer, unsigned int magnificationFactor, QString fileName, QString filter) { - if ((renderer == nullptr) ||(magnificationFactor < 1) || fileName.isEmpty()) - return; + if ((renderer == nullptr) ||(magnificationFactor < 1) || fileName.isEmpty()) + return; - bool doubleBuffering( renderer->GetRenderWindow()->GetDoubleBuffer() ); - renderer->GetRenderWindow()->DoubleBufferOff(); + bool doubleBuffering( renderer->GetRenderWindow()->GetDoubleBuffer() ); + renderer->GetRenderWindow()->DoubleBufferOff(); - vtkImageWriter* fileWriter = nullptr; + vtkImageWriter* fileWriter = nullptr; - QFileInfo fi(fileName); - QString suffix = fi.suffix().toLower(); + QFileInfo fi(fileName); + QString suffix = fi.suffix().toLower(); - if (suffix.isEmpty() || (suffix != "png" && suffix != "jpg" && suffix != "jpeg")) + if (suffix.isEmpty() || (suffix != "png" && suffix != "jpg" && suffix != "jpeg")) + { + if (filter == m_PNGExtension) { - if (filter == m_PNGExtension) - { - suffix = "png"; - } - else if (filter == m_JPGExtension) - { - suffix = "jpg"; - } - fileName += "." + suffix; - } - - if (suffix.compare("jpg", Qt::CaseInsensitive) == 0 || suffix.compare("jpeg", Qt::CaseInsensitive) == 0) - { - vtkJPEGWriter* w = vtkJPEGWriter::New(); - w->SetQuality(100); - w->ProgressiveOff(); - fileWriter = w; + suffix = "png"; } - else //default is png + else if (filter == m_JPGExtension) { - fileWriter = vtkPNGWriter::New(); + suffix = "jpg"; } + fileName += "." + suffix; + } + + if (suffix.compare("jpg", Qt::CaseInsensitive) == 0 || suffix.compare("jpeg", Qt::CaseInsensitive) == 0) + { + vtkJPEGWriter* w = vtkJPEGWriter::New(); + w->SetQuality(100); + w->ProgressiveOff(); + fileWriter = w; + } + else //default is png + { + fileWriter = vtkPNGWriter::New(); + } - vtkRenderLargeImage* magnifier = vtkRenderLargeImage::New(); - magnifier->SetInput(renderer); - magnifier->SetMagnification(magnificationFactor); - //magnifier->Update(); - fileWriter->SetInputConnection(magnifier->GetOutputPort()); - fileWriter->SetFileName(fileName.toLatin1()); + vtkRenderLargeImage* magnifier = vtkRenderLargeImage::New(); + magnifier->SetInput(renderer); + magnifier->SetMagnification(magnificationFactor); + //magnifier->Update(); + fileWriter->SetInputConnection(magnifier->GetOutputPort()); + fileWriter->SetFileName(fileName.toLatin1()); - // vtkRenderLargeImage has problems with different layers, therefore we have to - // temporarily deactivate all other layers. - // we set the background to white, because it is nicer than black... - double oldBackground[3]; - renderer->GetBackground(oldBackground); + // vtkRenderLargeImage has problems with different layers, therefore we have to + // temporarily deactivate all other layers. + // we set the background to white, because it is nicer than black... + double oldBackground[3]; + renderer->GetBackground(oldBackground); - // QColor color = QColorDialog::getColor(); - double bgcolor[] = {m_BackgroundColor.red()/255.0, m_BackgroundColor.green()/255.0, m_BackgroundColor.blue()/255.0}; - renderer->SetBackground(bgcolor); + // QColor color = QColorDialog::getColor(); + double bgcolor[] = {m_BackgroundColor.red()/255.0, m_BackgroundColor.green()/255.0, m_BackgroundColor.blue()/255.0}; + renderer->SetBackground(bgcolor); - mitk::IRenderWindowPart* renderWindowPart = this->GetRenderWindowPart(); + mitk::IRenderWindowPart* renderWindowPart = this->GetRenderWindowPart(); - renderWindowPart->EnableDecorations(false); + renderWindowPart->EnableDecorations(false); - fileWriter->Write(); - fileWriter->Delete(); + fileWriter->Write(); + fileWriter->Delete(); - renderWindowPart->EnableDecorations(true); + renderWindowPart->EnableDecorations(true); - renderer->SetBackground(oldBackground); + renderer->SetBackground(oldBackground); - renderer->GetRenderWindow()->SetDoubleBuffer(doubleBuffering); + renderer->GetRenderWindow()->SetDoubleBuffer(doubleBuffering); } void QmitkScreenshotMaker::SelectBackgroundColor() { - m_BackgroundColor = QColorDialog::getColor(); + m_BackgroundColor = QColorDialog::getColor(); - m_Controls->m_BackgroundColor->setAutoFillBackground(true); + m_Controls->m_BackgroundColor->setAutoFillBackground(true); - QString styleSheet = "background-color:rgb("; - styleSheet.append(QString::number(m_BackgroundColor.red())); - styleSheet.append(","); - styleSheet.append(QString::number(m_BackgroundColor.green())); - styleSheet.append(","); - styleSheet.append(QString::number(m_BackgroundColor.blue())); - styleSheet.append(")"); - m_Controls->m_BackgroundColor->setStyleSheet(styleSheet); + QString styleSheet = "background-color:rgb("; + styleSheet.append(QString::number(m_BackgroundColor.red())); + styleSheet.append(","); + styleSheet.append(QString::number(m_BackgroundColor.green())); + styleSheet.append(","); + styleSheet.append(QString::number(m_BackgroundColor.blue())); + styleSheet.append(")"); + m_Controls->m_BackgroundColor->setStyleSheet(styleSheet); } diff --git a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.h b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.h index 3fde4127d5..754d8b5e45 100644 --- a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.h +++ b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMaker.h @@ -1,129 +1,132 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #if !defined(QMITK_ScreenshotMaker_H__INCLUDED) #define QMITK_ScreenshotMaker_H__INCLUDED #include #include #include "mitkCameraRotationController.h" #include "mitkStepper.h" #include "mitkMultiStepper.h" #include "mitkMovieGenerator.h" #include "itkCommand.h" #include "vtkEventQtSlotConnect.h" #include "vtkRenderWindow.h" #include "mitkVtkPropRenderer.h" #include "ui_QmitkScreenshotMakerControls.h" //#include "../MovieMakerDll.h" //class QmitkMovieMakerControls; class QmitkStepperAdapter; class vtkCamera; class QTimer; class QTime; /** * \brief View for creating movies (AVIs) */ class QmitkScreenshotMaker: public QmitkAbstractView, public mitk::IRenderWindowPartListener { Q_OBJECT public: /** \brief Constructor. */ QmitkScreenshotMaker(QObject *parent=0, const char *name=0); /** \brief Destructor. */ virtual ~QmitkScreenshotMaker(); /** \brief Method for creating the widget containing the application * controls, like sliders, buttons etc. */ virtual void CreateQtPartControl(QWidget *parent) override; // virtual QWidget * CreateControlWidget(QWidget *parent); /// /// Sets the focus to an internal widget. /// virtual void SetFocus() override; /** \brief Method for creating the connections of main and control widget. */ virtual void CreateConnections(); /** \brief Method for creating an QAction object, i.e. button & menu entry. * @param parent the parent QWidget */ // virtual QAction * CreateAction(QActionGroup *parent); /// /// Called when a RenderWindowPart becomes available. /// virtual void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) override; /// /// Called when a RenderWindowPart becomes unavailable. /// virtual void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) override; signals: protected slots: void GenerateScreenshot(); void GenerateMultiplanarScreenshots(); void Generate3DHighresScreenshot(); void GenerateMultiplanar3DHighresScreenshot(); void SelectBackgroundColor(); protected: QObject *parentWidget; QWidget* m_Parent; vtkEventQtSlotConnect * connections; vtkRenderWindow * renderWindow; mitk::VtkPropRenderer::Pointer m_PropRenderer; Ui::QmitkScreenshotMakerControls* m_Controls; private: virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; vtkCamera* GetCam(); void GenerateHR3DAtlasScreenshots(QString fileName, QString filter = ""); void GenerateMultiplanarScreenshots(QString fileName); + mitk::DataNode::Pointer GetTopLayerNode(); + void MultichannelScreenshot(mitk::VtkPropRenderer* renderer, QString fileName, QString filter); + /*! \brief taking a screenshot "from" the specified renderer \param magnificationFactor specifying the quality of the screenshot (the magnification of the actual RenderWindow size) \param fileName file location and name where the screenshot should be saved */ void TakeScreenshot(vtkRenderer* renderer, unsigned int magnificationFactor, QString fileName, QString filter = ""); QColor m_BackgroundColor; mitk::DataNode* m_SelectedNode; QString m_LastPath; QString m_LastFile; QString m_PNGExtension = "PNG File (*.png)"; QString m_JPGExtension = "JPEG File (*.jpg)"; }; #endif // !defined(QMITK_ScreenshotMaker_H__INCLUDED) diff --git a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMakerControls.ui b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMakerControls.ui index f80d180dac..ceeffda16d 100644 --- a/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMakerControls.ui +++ b/Plugins/org.mitk.gui.qt.moviemaker/src/internal/QmitkScreenshotMakerControls.ui @@ -1,175 +1,185 @@ QmitkScreenshotMakerControls 0 0 315 368 ScreenshotMaker 2D Screenshots - + + + + Multiplanar + + + + axial coronal sagittal - + Single - - + + - Multiplanar + All Components + + + false 3D Screenshots (High-res) Single Multiplanar 0 0 Upsampling: 1 4 Options Background Color: 30 30 30 30 Qt::Horizontal 40 20 Qt::Vertical 20 31