VTK繪圖視窗vtkRenderWindow 儲存為圖片,並且不顯示繪圖視窗
阿新 • • 發佈:2019-01-06
VTK繪圖視窗vtkRenderWindow 儲存為圖片,並且不顯示繪圖視窗
參考連結;
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/CloseWindow
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Utilities/OffScreenRendering
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Utilities/Screenshot
https://zhangxc.com/2015/03/vtk-workflow
程式碼如下:
/* * 某個面數據; 輸出圖片路徑和名稱 ;是否視覺化繪圖結果 */ private static void saveAsJPGTriangleStripsDataStructureMapping( double[][] data, String filename, boolean flag) { // TODO Auto-generated method stub vtkPolyData ploydata = new vtkPolyData(); vtkPoints points = new vtkPoints(); vtkCellArray cellArray = new vtkCellArray(); vtkFloatArray scalars = new vtkFloatArray(); int[][] posID = new int[data.length][data[0].length]; // 插入點 for (int i = 0; i < data.length; i++) { for (int j = 0; j < data[0].length; j++) { int id0 = points.InsertNextPoint(i, j, 0); posID[i][j] = id0; scalars.InsertNextTuple1(data[i][j]); } } // 構造資料結構:三角形帶strip for (int i = 0; i < data.length - 1; i++) { cellArray.InsertNextCell(data[0].length * 2); for (int j = 0; j < data[0].length; j++) { cellArray.InsertCellPoint(posID[i][j]); cellArray.InsertCellPoint(posID[i + 1][j]); } } // We now assign the pieces to the vtkPolyData. ploydata.SetPoints(points); ploydata.SetStrips(cellArray);// SetStrips設定單元排列(cell array)定義三角形帶strip ploydata.GetPointData().SetScalars(scalars); double[] scalarRange = ploydata.GetScalarRange(); // 定義線性顏色對映表,連續顏色對映 vtkLookupTable lut = new vtkLookupTable(); lut.SetHueRange(0.3, 1.0);// 色調 lut.SetAlphaRange(0.9, 0.95); lut.SetValueRange(0.9, 1); lut.SetSaturationRange(0.95, 0.97); lut.SetNumberOfTableValues(256); lut.SetRange(scalarRange); lut.SetScaleToLinear(); lut.Build(); // Now we'll look at it. vtkPolyDataMapper Mapper = new vtkPolyDataMapper(); Mapper.SetInputData(ploydata); Mapper.SetScalarRange(ploydata.GetScalarRange()[0], ploydata.GetScalarRange()[1]); Mapper.SetLookupTable(lut); vtkActor actor = new vtkActor(); actor.SetMapper(Mapper); vtkRenderer ren = new vtkRenderer(); ren.SetBackground(1, 1, 1); ren.AddActor(actor); vtkRenderWindow renWin = new vtkRenderWindow(); renWin.AddRenderer(ren); if (!flag) { renWin.SetOffScreenRendering(1);// 儲存繪圖視窗時,不顯示該視窗 } // renWin.SetSize(800, 600); // renWin.SetAlphaBitPlanes(1); vtkRenderWindowInteractor iren = new vtkRenderWindowInteractor(); iren.SetRenderWindow(renWin); vtkCamera cam = new vtkCamera(); cam.SetFocalPoint(0, 0, 0); cam.SetPosition(0, 0, 1); cam.ComputeViewPlaneNormal(); cam.SetViewUp(0, 1, 0); // cam.Zoom(2); ren.SetActiveCamera(cam); /* * 要在vtk中新增新的互動方式需要從vtkInteractorStyle 類中派生新的類, * 如vtkInteractorStyleTrackballCamera實現操作杆互動方式,對相機進行互動。 */ vtkInteractorStyleTrackballCamera style = new vtkInteractorStyleTrackballCamera(); iren.SetInteractorStyle(style); renWin.Render(); ren.ResetCamera(); renWin.SetWindowName("vtk_show"); // Screenshot vtkWindowToImageFilter wif = new vtkWindowToImageFilter(); wif.SetInput(renWin); // wif.SetMagnification(2); // set the resolution of the output image (3 // // times the current resolution of vtk // // render window) // wif.SetInputBufferTypeToRGBA(); // also record the alpha // (transparency) // // channel // wif.ReadFrontBufferOff(); // read from the back buffer wif.Update(); // vtkPNGWriter writer = new vtkPNGWriter(); // writer.SetFileName("././data/screenshot2.png"); // writer.SetInputConnection(wif.GetOutputPort()); // writer.Write(); vtkJPEGWriter writer = new vtkJPEGWriter(); writer.SetFileName(filename); writer.SetInputConnection(wif.GetOutputPort()); writer.Write(); if (flag) {// 儲存繪圖視窗時不能有該操作 iren.Initialize(); iren.Start(); } else { iren.GetRenderWindow().Finalize();// 關閉繪圖視窗 } return; }
主要的點: