VTK is used to display some built-in data structures, stereoscopic images and images easily, but many people can’t figure out how to display a pixel image. Someone asked me about the technology, so I put it together and made a blog.

Include the required headers first:

`#include<vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2) VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); #include <vtkImageImport.h> #include <vtkSmartPointer.h> #include <vtkRenderer.h> #include <vtkImageActor.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleTrackballCamera.h> #include <iostream> using std::cout; using std::endl; # include < vtkInteractorStyleImage. H > which VTK_MODULE_INIT (vtkRenderingOpenGL2) VTK_MODULE_INIT (vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); `Copy the code

Is to avoid some errors associated with it. For the moment, I forget where these mistakes come from, but other blogs said that it would be better to add them.

`int main(int argc, char *argv[]) { return EXIT_SUCCESS; } `Copy the code

In the main function, we start adding things: first we create a bunch of objects, first to store the image data, then the scene renderer and the Actor for the rendering engine described earlier, then the render window and the interactor, using a simple interaction style. (I’m also covering custom interaction styles in my current series of blogs.)

` vtkSmartPointer<vtkImageImport>imageImport = vtkSmartPointer<vtkImageImport>::New(); vtkSmartPointer<vtkRenderer>sceneRenderer = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkImageActor>imageActor = vtkSmartPointer<vtkImageActor>::New(); vtkSmartPointer<vtkRenderWindow>renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New(); `Copy the code

Next we do some window initialization.

` renderWindow - > SetSize (600600); SceneRenderer - > SetBackground (0.8, 0.0, 0.0); renderWindow->AddRenderer(sceneRenderer); sceneRenderer->AddActor(imageActor); //renderWindow->SetMultiSamples(0); interactor->SetRenderWindow(renderWindow); interactor->SetInteractorStyle(style); int width = 512; int height = 512; `Copy the code

We define an array to hold data:

`const int Size = width* height * 3 * sizeof(unsigned char); unsigned char* m_pPixels = (unsigned char*)malloc(Size); for (int i = 0; i<width; i++){ for (int j = 0; j < height; j+=1) { m_pPixels[(i*width + j) * 3] = 0; m_pPixels[(i*width + j) * 3 + 1] = 255; m_pPixels[(i*width + j) * 3 + 2] = 0; } } for (int i = 0; i<20; i++) { for (int j = 0; j < 20; j += 1) { m_pPixels[(i*width + j) * 3] = 0; m_pPixels[(i*width + j) * 3 + 1] = 0; m_pPixels[(i*width + j) * 3 + 2] = 255; } } for (int i = 40; i<60; i++) { for (int j = 0; j < 20; j += 1) { m_pPixels[(i*width + j) * 3] = 0; m_pPixels[(i*width + j) * 3 + 1] = 0; m_pPixels[(i*width + j) * 3 + 2] = 255; }} `Copy the code

This array is 3 times the length by width, which means that each pixel corresponds to the RGB three colors. Then we set the whole space to green and the two areas inside to blue.

`imageImport->SetImportVoidPointer(m_pPixels); ImageImport ->SetDataOrigin(-0.5f * (float)width, -0.5f * (float)height, 0); //imageImport->SetDataOrigin(-0.5f * (float)width, -0.5f * (float)height, 0); imageImport->SetWholeExtent(0, width - 1, 0, height - 1, 0, 0); imageImport->UpdateWholeExtent(); imageImport->SetDataExtentToWholeExtent(); imageImport->SetDataScalarTypeToUnsignedChar(); imageImport->SetNumberOfScalarComponents(3); imageImport->Update(); imageActor->SetInputData(imageImport->GetOutput()); renderWindow->Render(); interactor->Start(); `Copy the code

And then set up the display content area, the scope of data. Then send it to the actor and start rendering. The effect is as follows:

Note that the green area shrinks as the display box changes.

Now attach the entire code:

`#include<vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2) VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); #include <vtkImageImport.h> #include <vtkSmartPointer.h> #include <vtkRenderer.h> #include <vtkImageActor.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleTrackballCamera.h> #include <iostream> using std::cout; using std::endl; #include <vtkInteractorStyleImage.h> int main(int argc, char *argv[]) { vtkSmartPointer<vtkImageImport>imageImport = vtkSmartPointer<vtkImageImport>::New(); vtkSmartPointer<vtkRenderer>sceneRenderer = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkImageActor>imageActor = vtkSmartPointer<vtkImageActor>::New(); vtkSmartPointer<vtkRenderWindow>renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New(); RenderWindow - > SetSize (600600); SceneRenderer - > SetBackground (0.8, 0.0, 0.0); renderWindow->AddRenderer(sceneRenderer); sceneRenderer->AddActor(imageActor); //renderWindow->SetMultiSamples(0); interactor->SetRenderWindow(renderWindow); interactor->SetInteractorStyle(style); int width = 512; //(renderWindow->GetSize())[0]; int height = 512; //(renderWindow->GetSize())[1]; //cout << width << " " << height<<endl; const int Size = width* height * 3 * sizeof(unsigned char); unsigned char* m_pPixels = (unsigned char*)malloc(Size); for (int i = 0; i<width; i++){ for (int j = 0; j < height; j+=1) { m_pPixels[(i*width + j) * 3] = 0; m_pPixels[(i*width + j) * 3 + 1] = 255; m_pPixels[(i*width + j) * 3 + 2] = 0; } } for (int i = 0; i<20; i++) { for (int j = 0; j < 20; j += 1) { m_pPixels[(i*width + j) * 3] = 0; m_pPixels[(i*width + j) * 3 + 1] = 0; m_pPixels[(i*width + j) * 3 + 2] = 255; } } for (int i = 40; i<60; i++) { for (int j = 0; j < 20; j += 1) { m_pPixels[(i*width + j) * 3] = 0; m_pPixels[(i*width + j) * 3 + 1] = 0; m_pPixels[(i*width + j) * 3 + 2] = 255; } } imageImport->SetImportVoidPointer(m_pPixels); ImageImport ->SetDataOrigin(-0.5f * (float)width, -0.5f * (float)height, 0); //imageImport->SetDataOrigin(-0.5f * (float)width, -0.5f * (float)height, 0); imageImport->SetWholeExtent(0, width - 1, 0, height - 1, 0, 0); imageImport->UpdateWholeExtent(); imageImport->SetDataExtentToWholeExtent(); imageImport->SetDataScalarTypeToUnsignedChar(); imageImport->SetNumberOfScalarComponents(3); imageImport->Update(); imageActor->SetInputData(imageImport->GetOutput()); renderWindow->Render(); interactor->Start(); return EXIT_SUCCESS; } `Copy the code