[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