VTK图像创建

注:此文知识学习笔记,仅记录完整程序和实现结果,具体原理参见:

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.


猜你喜欢

转载自blog.csdn.net/kateyabc/article/details/80312033