Search code examples
c++3dvtk

Render a simple image using vtkDataImage


I want to render a simple image using vtkImageData in C++. I know that vtkImageDataGeometryFilter can do the job, but I'm asking if there is an other way to get the same result without using PolyData ? Here is my code, but I have an access violation reading while rendering, I don't know why...

vtkSmartPointer<vtkImageData> imageData =
vtkSmartPointer<vtkImageData>::New();
imageData->SetExtent(0, 5, 0, 5, 0, 1);
imageData->SetSpacing(1, 1, 1);
imageData->SetOrigin(0, 0, 0);
for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < 5; j++)
    {
        imageData->SetScalarComponentFromFloat(i,j,0,0,0);
    }
}

vtkSmartPointer<vtkImageActor> imageActor =
    vtkSmartPointer<vtkImageActor>::New();
imageActor->SetInputData(imageData);

vtkSmartPointer<vtkRenderer> renderer =
    vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
    vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);

renderer->AddActor(imageActor);

renderWindow->Render();
renderWindowInteractor->Start();

Thanks in advance for your help ^^


Solution

  • I found the bug finally. The line imageData->AllocateScalars(VTK_FLOAT, 3); was missing.
    The following code displays a green square:

    vtkSmartPointer<vtkImageData> imageData =
        vtkSmartPointer<vtkImageData>::New();
    imageData->SetExtent(0, 50, 0, 50, 0, 1);
    imageData->SetSpacing(1, 1, 1);
    imageData->SetOrigin(0, 0, 0);
    imageData->AllocateScalars(VTK_FLOAT, 3);
    for (int i = 0; i < 50; i++)
    {
        for (int j = 0; j < 50; j++)
        {
            imageData->SetScalarComponentFromFloat(i, j, 0, 1, 255);
        }
    }
    
    vtkSmartPointer<vtkImageActor> imageActor =
        vtkSmartPointer<vtkImageActor>::New();
    imageActor->SetInputData(imageData);
    
    vtkSmartPointer<vtkRenderer> renderer =
        vtkSmartPointer<vtkRenderer>::New();
    vtkSmartPointer<vtkRenderWindow> renderWindow =
        vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
        vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);
    
    renderer->AddActor(imageActor);
    renderer->SetBackground(1, 0, 0.5);
    renderWindow->Render();
    renderWindowInteractor->Start();