[vtkusers] vtkImageImport Segfault

Mathieu Malaterre mathieu.malaterre at kitware.com
Tue May 31 10:40:02 EDT 2005


Randall,

	I would suggest you try Amy solution which seems by far the best. Sorry 
about my rough description of my solution here is a more detailed:

you would need to create let say a vtkDoubleArray, use SetVoidArray. 
Then pass the vtkDataArray to vtkImgeData like this:

vtkImageData::GetPointData::SetScalars( doubleArray );

	Since you are passing a pointer in SetVoidArray you can do any kind of 
trick you want... But again Amy's solution seems easier.

HTH
Mathieu


Amy Squillacote wrote:
> Did you try using the SetHeaderSize method in vtkImageReader2 (the 
> superclass of vtkImageReader)?  I know it isn't just specifying a number 
> of bytes to read, but using that and the SetDataExtent method (also in 
> vtkImageReader) should do the right thing.
> 
> - Amy
> 
> At 10:15 AM 5/31/2005, Randall Hand wrote:
> 
>> Ok, I'm looking at this now (computers are finally back online :) ), 
>> and I can't figure out how to set the raw number of bytes to read.  I 
>> see SetDataVOI, but nothing to "bypass" that and specify a number of 
>> bytes.
>>
>> On 5/27/05, *Mathieu Malaterre* < mathieu.malaterre at kitware.com 
>> <mailto:mathieu.malaterre at kitware.com>> wrote:
>>
>>     Randall,
>>
>>             Hum I believe you can read those bytes but never use it...
>>     Could you
>>     try to read 3,840,384,800 bytes + 4 but set properly the dimension. If
>>     you are lucky enough no test is done to check consistency of datasize
>>     and dimension of data.
>>
>>     My 2 cents,
>>     Mathieu
>>
>>     Randall Hand wrote:
>>     > Well, I have an addition 4 bytes at the end of the file to skip as
>>     > well.. I suppose I could postprocess & write a new file without
>>     these
>>     > final 4 bytes, but that's gonna be pretty wasteful of disk
>>     space.  Is
>>     > there a way to skip them?
>>     >
>>     >
>>     >
>>     > On 5/27/05, *Mathieu Malaterre* < mathieu.malaterre at kitware.com
>>     <mailto:mathieu.malaterre at kitware.com>
>>     > < mailto: mathieu.malaterre at kitware.com
>>     <mailto:%20mathieu.malaterre at kitware.com>>> wrote:
>>     >
>>     >     Randall,
>>     >
>>     >             Could you instead give vtkImageReader a try. Just
>>     specify
>>     >     the lenght of
>>     >     data you want to read: 3,840,384,800 bytes. By default
>>     vtkImageReader
>>     >     start reading from the end. Thefore you are garantee to skip a
>>     >     header if
>>     >     any (4 bytes in your case apparently).
>>     >
>>     >     HTH
>>     >     Mathieu
>>     >
>>     >     Randall Hand wrote:
>>     >      > I'm attempting to load a simple "Brick of Bytes (BoB)"
>>     format
>>     >     file into
>>     >      > VTK.  It is 2191x2191x800 unsigned chars (3,840,384,800
>>     bytes).
>>     >     With 4
>>     >      > bytes at the beginning that I have to skip (Gotta love
>>     fortran).  My
>>     >      > code is like the following:
>>     >      >
>>     >      >     if (stat(argv[1], &file_info) == -1) {
>>     >      >         perror("Unable to stat file!\n\t");
>>     >      >         return -1;
>>     >      >     }
>>     >      >     fptr = fopen(argv[1], "r");
>>     >      >     if ((data = (char*)malloc(file_info.st_size)) == NULL) {
>>     >      >         perror("Unable to allocate memory!\n\t");
>>     >      >         return -1;
>>     >      >     }
>>     >      >     dataptr = data;
>>     >      >     fread(dataptr, 1, 4, fptr);
>>     >      >     dataptr += 4;
>>     >      >     printf("\n\n");
>>     >      >     for(int i=0; i<xdim; i++) {
>>     >      >         fread(dataptr, ydim,zdim,  fptr);
>>     >      >         dataptr += (ydim * zdim);
>>     >      >     }
>>     >      >
>>     >      >     vtkImageImport *import = vtkImageImport::New();
>>     >      >     import->AddObserver(vtkCommand::ProgressEvent,
>>     progress);
>>     >      >     import->SetDataScalarTypeToUnsignedChar();
>>     >      >     import->SetNumberOfScalarComponents(1);
>>     >      >     import->SetWholeExtent(1, xdim-1,
>>     >      >                            1, ydim-1,
>>     >      >                            1, zdim-1);
>>     >      >     import->SetDataExtentToWholeExtent();
>>     >      >     import->SetImportVoidPointer(data + skip);
>>     >      >
>>     >      >     vtkDataSetWriter *writer = vtkDataSetWriter::New();
>>     >      >     writer->SetInput(import->GetOutput());
>>     >      >     writer->SetFileName("resulting.vtk");
>>     >      >     writer->Write();
>>     >      >
>>     >      >
>>     >      > When I run this, however, the output VTK file only
>>     contains the
>>     >     following:
>>     >      > # vtk DataFile Version 3.0
>>     >      > vtk output
>>     >      > ASCII
>>     >      > DATASET STRUCTURED_POINTS
>>     >      > DIMENSIONS 2191 2191 800
>>     >      > SPACING 1 1 1
>>     >      > ORIGIN 1 1 1
>>     >      >
>>     >      > No data is actually written to the file.  When I try to
>>     connect
>>     >     this to
>>     >      > a rendering pipeline or start querying the resulting
>>     vtkDataSet for
>>     >      > properties (Scalar ranges, number of points, etc) I get
>>     strange
>>     >     results
>>     >      > and eventually I get Segfault/Core dumps.  Often times
>>     the number of
>>     >      > points listed comes out as a large negative number,
>>     instead of the
>>     >      > 3.8bil that it should be.
>>     >      >
>>     >      > A stack trace of the core dumps only reveals this:
>>     >      >
>>     >      > [8:50:48am]% dbx imageimport
>>     >      > dbx version 7.3.4 (86441_Nov11 MR) Nov 11 2002 11:31:55
>>     >      > Core from signal SIGSEGV: Segmentation violation
>>     >      > (dbx) where
>>     >      >
>>     >      > Thread 0x10000
>>     >      >  >  0 vtkDataArrayTemplate<unsigned
>>     >     char>::ComputeScalarRange(int)(this
>>     >      > = 0xf4eb83c0, comp = 0)
>>     >      >
>>     >    
>>     ["/viz/home/rhand/src/ezViz/Utilities/VTK/Common/vtkDataArrayTemplate.txx":644,
>>     >      > 0x85f2758]
>>     >      > (dbx)
>>     >      > (dbx) quit
>>     >      >
>>     >      >
>>     >      >
>>     >      > --
>>     >      > Randall Hand
>>     >      > http://www.yeraze.com
>>     >      >
>>     >      >
>>     >      >
>>     >    
>>     ------------------------------------------------------------------------
>>
>>     >      >
>>     >      > _______________________________________________
>>     >      > This is the private VTK discussion list.
>>     >      > Please keep messages on-topic. Check the FAQ at:
>>     >     http://www.vtk.org/Wiki/VTK_FAQ
>>     >      > Follow this link to subscribe/unsubscribe:
>>     >      > http://www.vtk.org/mailman/listinfo/vtkusers
>>     <http://www.vtk.org/mailman/listinfo/vtkusers>
>>     >
>>     >
>>     >
>>     >
>>     > --
>>     > Randall Hand
>>     > http://www.yeraze.com < http://www.yeraze.com
>>     <http://www.yeraze.com/>>
>>
>>
>>
>>
>> -- 
>> Randall Hand
>> http://www.yeraze.com
>> _______________________________________________
>> This is the private VTK discussion list.
>> Please keep messages on-topic. Check the FAQ at: 
>> http://www.vtk.org/Wiki/VTK_FAQ
>> Follow this link to subscribe/unsubscribe:
>> http://www.vtk.org/mailman/listinfo/vtkusers




More information about the vtkusers mailing list