VTK009_vtk-图片图形图像

我与影子孤独终老i 提交于 2020-03-05 23:28:50

图像数据实例:

图像实例 1(绘制图像):


#include <iostream>
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkImageActor.h>
#include <vtkRenderer.h>
#include <vtkCamera.h>
#include <vtkTransform.h>
#include <vtkProperty.h>
#include <vtkImageCanvasSource2D.h>

int main(int argc, char* argv[])
{
	vtkSmartPointer<vtkRenderWindow> m_pRenderWin = vtkRenderWindow::New();
	vtkSmartPointer<vtkRenderWindowInteractor> m_pInteractor = vtkRenderWindowInteractor::New();
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> m_pInteractorStyle = vtkInteractorStyleTrackballCamera::New();
	vtkSmartPointer<vtkImageActor> m_actor = vtkImageActor::New();
	vtkSmartPointer<vtkRenderer> m_render = vtkRenderer::New();

	vtkSmartPointer<vtkImageCanvasSource2D> m_Image = vtkImageCanvasSource2D::New();

	vtkSmartPointer<vtkTransform> m_trans = vtkTransform::New();
	vtkSmartPointer<vtkCamera> m_pCamera = vtkCamera::New();

	m_Image->SetScalarTypeToUnsignedChar();		// 数据类型
	m_Image->SetNumberOfScalarComponents(1);	// 设置数量
	m_Image->SetExtent(0, 100, 0, 100, 0, 0);	// 设置画布大小,xyz范围
	m_Image->SetDrawColor(0, 0, 0, 0);	// 黑色
	m_Image->FillBox(0, 100, 0, 100);	// 画满整个画布
	m_Image->SetDrawColor(180, 0, 0, 0);	// 第一个参数决定颜色,只能是0~255的黑白渐变色
	m_Image->FillBox(40, 60, 20, 40);	// 画的范围,填充Box
	m_Image->Update();

	m_actor->SetInputData(m_Image->GetOutput());    // vtkImageData类型

	m_trans->Translate(0, 0, 0);
	m_trans->RotateX(0);		// 沿x轴正方向顺时针旋转
	m_actor->SetUserTransform(m_trans);

	m_render->AddActor(m_actor);
	//-------------------------------------------------------------------------
	// 相机设置
	m_pCamera->SetPosition(0, 0, 50);
	m_pCamera->SetFocalPoint(0, 0, 0);
	//-------------------------------------------------------------------------
	m_render->SetActiveCamera(m_pCamera);
	m_render->ResetCamera();
	m_render->SetViewport(0.0, 0.0, 1.0, 1.0);
	m_render->SetBackground(0.5, 0.3, 0.2);
	m_render->SetGradientBackground(true);		// 背景色渐变

	m_pRenderWin->AddRenderer(m_render);
	m_pRenderWin->SetSize(800, 600);
	m_pRenderWin->Render();

	m_pInteractor->SetInteractorStyle(m_pInteractorStyle);
	m_pInteractor->SetRenderWindow(m_pRenderWin);
	m_pRenderWin->Render();

	m_pInteractor->Start();

	return 0;
}

上面,绘制了一副2d图像,即黑色背景下绘制了一块白色的块,如图:


此外,还有很多可以生成2D图像的类,例如:

(1)、vtkImageEllipsoidSource:生成椭圆图像的类。

(2)、vtkImageGirdSource:生成网格图像的类

(3)、vtkImageNoiseSource:生成随机图像的类(噪声图像)。

(4)、vtkImageSinusoidSource:生成正弦函数图像。

(5)、vtkImageGaussianSource:生成符合高斯分布的图像。

图像数据:生成的图像,其类型全是vtkImageData类型,此外,图像不限于2D图像,实际上,之前例程中,读取的DICOM文件生成的图像是组成了一个空间的,这样,可以选择其中某个位置的图像显示,可以理解为:三维空间XYZ三个方向都层叠着很多层图像。实际可能并非如此。

生成图像:实际上,要得到vtkImageData,还可以直接申请一个vtkImageData来进行更改,并不是一定要从文件读取图片,或者创建自己的图像。

图像实例 2(打开图片):

int main(int argc, char*argv[])
{
	vtkSmartPointer<vtkPNGReader> pngReader = vtkSmartPointer<vtkPNGReader>::New();
	pngReader->SetFileName("ironMan.png");
	pngReader->Update();

	vtkSmartPointer<vtkSphereSource> ball = vtkSmartPointer<vtkSphereSource>::New();
	ball->SetCenter(0.0, 0.0, 0.0);
	ball->SetRadius(20.0);
	ball->SetPhiResolution(10);
	ball->SetThetaResolution(20);
	ball->Update();

// 	vtkSmartPointer<vtkPolyDataMapper> pngMap = vtkSmartPointer<vtkPolyDataMapper>::New();
// 	pngMap->SetInputConnection(pngReader->GetOutputPort());
// 	vtkSmartPointer<vtkActor> pngActor = vtkSmartPointer<vtkActor>::New();
// 	pngActor->SetMapper(pngMap);

	vtkSmartPointer<vtkImageActor> pngAct = vtkSmartPointer<vtkImageActor>::New();
	pngAct->SetInputData(pngReader->GetOutput());
	pngAct->GetProperty()->SetBackingColor(0.8, 0.6, 0.4);	// 无效

	vtkSmartPointer<vtkPolyDataMapper> ballMap = vtkSmartPointer<vtkPolyDataMapper>::New();
	ballMap->SetInputConnection(ball->GetOutputPort());
	vtkSmartPointer<vtkActor> ballActor = vtkSmartPointer<vtkActor>::New();
	ballActor->SetMapper(ballMap);

	vtkSmartPointer<vtkRenderer> pngRenderer = vtkSmartPointer<vtkRenderer>::New();
//	pngRenderer->AddActor(pngActor);		// 无效的
	pngRenderer->AddActor(pngAct);
	pngRenderer->AddActor(ballActor);
	pngRenderer->SetViewport(0, 0, 1.0, 1.0);	// 设置显示范围

	vtkSmartPointer<vtkRenderWindow> pngWnd = vtkSmartPointer<vtkRenderWindow>::New();
	pngWnd->AddRenderer(pngRenderer);
	pngWnd->SetSize(800, 600);
	vtkSmartPointer<vtkRenderWindowInteractor> iren =
		vtkSmartPointer<vtkRenderWindowInteractor>::New();
	vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
		vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
	iren->SetRenderWindow(pngWnd);
	iren->SetInteractorStyle(style);

	pngWnd->Render();
	iren->Initialize();
	iren->Start();	
}

上面代码显示了一个 球体和一张图片,球体在原点(0,0,0)。图像如下:

同样,vtk还提供了其他图像格式的读取器,使用他们的Writer类,可以写入图片,可以将png图像读取后,保存为jpg格式等,可以实现图像格式的转换。

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!