如何在后台运行 vtkRenderWindow 而不向用户显示 [英] How to run vtkRenderWindow in background without display it to user

查看:19
本文介绍了如何在后台运行 vtkRenderWindow 而不向用户显示的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用可以从 dicom 文件创建冠状、矢状和轴向图像的代码,但同时我不需要向用户显示 renderWindow,这是我的代码:

Im working in code which can create coronal, saggital, and axial image from dicom file, but In the same time I dont need to display renderWindow to user, and this is my code:

int main(int argc, char* argv[])
{
   // Verify input arguments
   if ( argc != 2 )
   {
      std::cout << "Usage: " << argv[0]
      << " FolderName" << std::endl;
      return EXIT_FAILURE;
   }

   std::string folder = argv[1];
   //std::string folder = "C:\\VTK\\vtkdata-5.8.0\\Data\\DicomTestImages";

   // Read all the DICOM files in the specified directory.
   vtkSmartPointer<vtkDICOMImageReader> reader =
      vtkSmartPointer<vtkDICOMImageReader>::New();
   reader->SetDirectoryName(folder.c_str());
   reader->Update();

   // Visualize
   vtkSmartPointer<vtkImageViewer2> imageViewer =
      vtkSmartPointer<vtkImageViewer2>::New();
   imageViewer->SetInputConnection(reader->GetOutputPort());
imageViewer->SetSlice(0);
  imageViewer->Render();

for(int k = 0; k < 3; k++){

cout<< k << endl;

if(k == 0){
imageViewer->SetSliceOrientationToYZ();
}else if(k == 1){
imageViewer->SetSliceOrientationToXZ();
}else{
 imageViewer->SetSliceOrientationToXY();
}
    int _MinSlice = imageViewer->GetSliceMin();
        int _MaxSlice = imageViewer->GetSliceMax();

     // Screenshot  
  vtkSmartPointer<vtkWindowToImageFilter> windowToImageFilter = 
    vtkSmartPointer<vtkWindowToImageFilter>::New();

 vtkSmartPointer<vtkPNGWriter> writer = 
    vtkSmartPointer<vtkPNGWriter>::New();
for (int i = _MinSlice; i < _MaxSlice; i++){
  vtkSmartPointer<vtkWindowToImageFilter> windowToImageFilter = 
    vtkSmartPointer<vtkWindowToImageFilter>::New();

 vtkSmartPointer<vtkPNGWriter> writer = 
    vtkSmartPointer<vtkPNGWriter>::New();

  windowToImageFilter->SetInput(imageViewer->GetRenderWindow());
  windowToImageFilter->ReadFrontBufferOff(); // read from the back buffer
  windowToImageFilter->Update();

  std::string filename = "img/" + std::to_string(k) + "/" + std::to_string(i) + ".png";
  char *y = new char[filename.length() + 1];
  std::strcpy(y, filename.c_str());

  writer->SetFileName(y);
  writer->SetInputConnection(windowToImageFilter->GetOutputPort());
  writer->Write();

  imageViewer->SetSlice(i);
  imageViewer->Render();
}
}

   return EXIT_SUCCESS;
}

我的问题是当尝试 imageViewer->SetRenderWindow(NULL);imageViewer->GetRenderWindow()->Delete(); 它会删除 renderWindow实例,并且代码将被破坏,这样我如何才能让 renderWindow 在后台工作而不将其显示给用户?

my issue is when try imageViewer->SetRenderWindow(NULL); Or imageViewer->GetRenderWindow()->Delete(); its will remove renderWindow instance, and code will be break, so that how I can keep renderWindow work in background without display it to user?

谢谢

推荐答案

你可以使用 SetShowWindow(bool) 或 ShowWindowOff(),这些方法都继承自 vtkWindow.这样做不应该停止渲染管道(您可能仍然可以使用 windowToImageFilter)但是我没有测试它.让我们知道它是否有效.

You can use SetShowWindow(bool) or ShowWindowOff(), these methods are inherited from vtkWindow. Doing so should not stop the rendering pipeline (you can probably still use windowToImageFilter) but tbh I did not test it. Let us know if it worked.

这篇关于如何在后台运行 vtkRenderWindow 而不向用户显示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆