注:此文知识学习笔记,仅记录完整程序和实现结果,具体原理参见:
https://blog.csdn.net/www_doling_net/article/details/8541534
#include <vtkSmartPointer.h> #include <vtkImageData.h> #include <vtkImageCanvasSource2D.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleImage.h> #include <vtkRenderer.h> #include <vtkImageActor.h> int main() { vtkSmartPointer<vtkImageCanvasSource2D> canvas = vtkSmartPointer<vtkImageCanvasSource2D>::New(); canvas->SetScalarTypeToUnsignedChar(); canvas->SetNumberOfScalarComponents(1); canvas->SetExtent(0, 100, 0, 100, 0, 0);//设置画布的像素数据类型、成分数目和画布大小 canvas->SetDrawColor(0, 0, 0, 0); canvas->FillBox(0, 100, 0, 100); canvas->SetDrawColor(255, 0, 0, 0); canvas->FillBox(20, 40, 20, 40); canvas->Update(); // Create actors vtkSmartPointer<vtkImageActor> redActor = vtkSmartPointer<vtkImageActor>::New(); redActor->SetInputData(canvas->GetOutput()); // Define viewport ranges // (xmin, ymin, xmax, ymax) double redViewport[4] = { 0.0, 0.0, 1.0, 1.0 }; // Setup renderers vtkSmartPointer<vtkRenderer> redRenderer = vtkSmartPointer<vtkRenderer>::New(); redRenderer->SetViewport(redViewport); redRenderer->AddActor(redActor); redRenderer->ResetCamera(); redRenderer->SetBackground(1.0, 1.0, 1.0); // Setup render window vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(redRenderer); renderWindow->SetSize(640, 480); renderWindow->Render(); renderWindow->SetWindowName("ImageCanvasSource2D"); // Setup render window interactor vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New(); renderWindowInteractor->SetInteractorStyle(style); // Render and start interaction renderWindowInteractor->SetRenderWindow(renderWindow); renderWindowInteractor->Initialize(); renderWindowInteractor->Start(); return EXIT_SUCCESS; }
运行结果:
2、直接创建图像
#include <vtkSmartPointer.h> #include <vtkImageData.h> #include <vtkImageActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyle.h> #include <vtkInformation.h> int main() { //vtk的新版本在vtkImageData类中取消了SetScalarTypeToUnsignedChar()方法; //现在仅能用如下方法设置: //static void SetScalarType(int, vtkInformation* meta_data); vtkSmartPointer<vtkImageData> img = vtkSmartPointer<vtkImageData>::New(); vtkSmartPointer<vtkInformation> info = vtkSmartPointer<vtkInformation>::New(); img->SetDimensions(16, 16, 1); img->SetScalarType(VTK_UNSIGNED_CHAR, info); img->SetNumberOfScalarComponents(1, info);//每个像素需要表示的组份 =1是指标量图 img->AllocateScalars(info);//很重要 unsigned char *ptr = NULL; ptr = (unsigned char*)img->GetScalarPointer(); for (int i = 0; i<16 * 16 * 1; i++) { *ptr++ = i % 256; } ///////////////启动渲染引擎 vtkSmartPointer<vtkImageActor> actor = vtkSmartPointer<vtkImageActor>::New(); actor->SetInputData(img); double viewport[4] = { 0, 0, 1, 1 }; //设置视口 vtkSmartPointer<vtkRenderer> render = vtkSmartPointer<vtkRenderer>::New(); render->SetViewport(viewport); render->AddActor(actor); render->ResetCamera(); render->SetBackground(1, 1, 1); vtkSmartPointer<vtkRenderWindow> window = vtkSmartPointer<vtkRenderWindow>::New(); window->AddRenderer(render); window->SetSize(640, 480); window->Render(); window->SetWindowName("CreateVTKImageData"); vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New(); vtkSmartPointer<vtkInteractorStyle> style = vtkSmartPointer<vtkInteractorStyle>::New(); rwi->SetInteractorStyle(style); rwi->SetRenderWindow(window); rwi->Initialize(); rwi->Start(); return 0; }
运行结果:
参考资料:
1.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
2. 张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.