[vtkusers] vtkImageReader - stumped on extents! - solved
dean.inglis at on.aibn.com
dean.inglis at on.aibn.com
Tue Feb 25 16:59:21 EST 2003
Ok, here is what really works:
<snip>
m_reader->SetFileName(OpenDlg->FileName.c_str());
m_reader->SetDataExtent(0,extent,0,extent,0,0);
m_reader->UpdateWholeExtent(); //<-----****
<snip>
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();
m_imageActor1->SetDisplayExtent(m_imageActor1->GetInput()->GetUpdateExtent()); //<-----****
<snip>
thanks anyway.
Dean
>
> From: Amy Henderson <amy.henderson at kitware.com>
> Date: 2003/02/25 Tue PM 02:01:52 GMT-05:00
> To: <dean.inglis at on.aibn.com>, <vtkusers at public.kitware.com>
> Subject: Re: [vtkusers] vtkImageReader - stumped on extents!
>
> 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