[vtkusers] vtkImageReader - stumped on extents!
Amy Henderson
amy.henderson at kitware.com
Tue Feb 25 14:01:52 EST 2003
Here's what worked for me (done just after setting the filename on the reader):
imageActor->GetInput()->UpdateInformation();
imageActor->GetInput()->SetUpdateExtentToWholeExtent();
imageActor->GetInput()->Update();
- Amy
At 01:44 PM 2/25/2003 -0500, dean.inglis at on.aibn.com wrote:
>Ok, I'm stumped...
>
>I've tried the archives but can't seem to find a closely related discussion.
>I've tried reading most of the relevant class hierarchies but that is just
>sending me round in circles. So, I'll relate my coding attempts that fail:
>the pipeline:
>vtkImageReader---->vtkImageShiftScale---->vtkImageActor---->vtkRenderer
>
>the reader is initialized at app start up to read a given 2D square image
>from
>a binary file having a fixed header. The extents depend on the file size:
>
>void my_app_vtk_init_fn()
>{
> m_reader->SetDataScalarTypeToShort();
> m_reader->SetDataByteOrderToLittleEndian();
> m_reader->SetFileDimensionality(2);
> m_reader->FileLowerLeftOff();
> m_reader->SetDataOrigin(0,0,0);
> m_reader->SetHeaderSize(1609);
> m_reader->SetDataSpacing (0.2, 0.2, 1.0);
>
><snip>
>
>The file name is retrieved from a file dialogue. The extents are calculated
>and set:
>
>void m_app_open_file(string FileName)
>{
> struct stat statbuf;
> FILE *stream;
>
> if ((stream = fopen(FileName.c_str(), "rb"))
> == NULL)
> {
> return;
> }
>
> fstat(fileno(stream), &statbuf);
> fclose(stream);
>
> int extent = static_cast<int>(sqrt((statbuf.st_size - 1609)/2))-1;
>
> m_reader->SetFileName(OpenDlg->FileName.c_str());
> m_reader->SetDataExtent(0,extent,0,extent,0,0);
> m_reader->Modified();
> m_reader->UpdateWholeExtent();
>
><snip>
>
>Then the display is set up:
>
>void my_app_init_display()
>{
> float range[2];
> m_reader->GetOutput()->GetScalarRange(range);
> float slope = 255.0f/(range[1] - range[0]);
> float intercept = -slope*range[0];
> float shift = intercept/slope;
>
> m_shift->SetShift(shift);
> m_shift->SetScale(slope);
> m_shift->SetInput(m_reader->GetOutput());
> m_shift->UpdateWholeExtent();
>
> m_imageActor1->SetInput(m_shift->GetOutput());
> m_imageActor1->InterpolateOff();
> m_imageActor1->VisibilityOn();
>
> vtkRenderer* ren = RenderWindow1->GetRenderer();
> if(!CameraCheckBox->Checked){ ren->ResetCamera(); }
> RenderWindow1->Invalidate();
>}
>
>All is well if the first image read in is smaller than any
>subsequent images. However, if I read in larger image and
>then attempt to read in a smaller image, debug activated for
>the m_reader and its output shows (small is 503 x 503, large is
>578 x 578):
>
>Debug: In c:\Builder\Sources\VTK\Common\vtkDataObject.h, line 255
>vtkImageData (01BEE1F4): vtkImageData (01BEE1F4): returning
>RequestExactExtent of 0
>
>
>ERROR: In c:\Builder\Sources\VTK\Common\vtkDataObject.cxx, line 548
>vtkImageData (01BEE1F4): Update extent does not lie within whole extent
>
>
>ERROR: In c:\Builder\Sources\VTK\Common\vtkDataObject.cxx, line 555
>vtkImageData (01BEE1F4): Update extent is: 0, 577, 0, 577, 0, 0
>
>
>ERROR: In c:\Builder\Sources\VTK\Common\vtkDataObject.cxx, line 562
>vtkImageData (01BEE1F4): Whole extent is: 0, 502, 0, 502, 0, 0
>
>
>I have tried m_reader->Update(), I have tried getting the output
>ahead of setting up the new extents:
>
>
>if(m_reader->GetOutput() != NULL)
> {
> vtkImageData* ptr = m_reader->GetOutput();
> ptr->PrepareForNewData();
> ptr->SetWholeExtent(0,extent,0,extent,0,0);
> ptr->SetExtent(0,extent,0,extent,0,0);
> ptr->SetUpdateExtent(0,extent,0,extent,0,0);
> ptr->AllocateScalars();
> }
>
>
>with variants thereof but none work!
>
>
>What am I missing here? Before the errors in the debug log, it
>appeared that the reader (and its output) was setting the extents
>properly, executed, but then the extents in the image were somehow
>overwritten to those of the previous image ....
>
>
>Dean
>
>_______________________________________________
>This is the private VTK discussion list.
>Please keep messages on-topic. Check the FAQ at:
><http://public.kitware.com/cgi-bin/vtkfaq>
>Follow this link to subscribe/unsubscribe:
>http://public.kitware.com/mailman/listinfo/vtkusers
More information about the vtkusers
mailing list