[vtkusers] How does one enforce recognition of little endian data in VTK?
Sanatan Sahgal
sanatan_sahgal at hotmail.com
Mon May 2 15:30:39 EDT 2005
Again, I am not using a VTK reader/importer classes. I do not want to use
these classes because they do not fulfill the needs of my application.
As explained in my original post, I set the data to VTK in the following
manner:
I am using the vtkImageData class. I feed data to the imageData
instance as follows:
imageData->GetPointData()->SetScalars(pixelArrayVtk);
The pixelArrayVtk instance is of type vtkDataArray and it is
setup as follows:
pixelArrayVtk = CreateVtkDataArray(); //Creates instance of
specific VtkDataArray type. Example: vtkShortArray::New()
pixelArrayVtk->SetVoidArray(imageRawData, totalSamples, 1);
The imageRawData parameter is a pointer to the memory location
which contains the raw image data in little endian format.
VTK expects this raw image data to be big endian for some reason. According
to your response it should be happy with the little endian format. But, it
is not! If the data is in big endian format I see the correct image on the
screen. If it is in little endian format I do not see a meaningful image on
the screen. The issue is that one would expect the opposite to be true
because I am working on an Intel platform which has the native format of
little endian byte ordering!
Are you saying that there is a compile time option which will tell VTK the
native byte ordering (without using any of the reader/importer classes). If
so, what is that compile time option and how does one set it?
-Sanatan
>
>If you compile vtk on a little-endian machine, then byteswapping will only
>occur when reading big-endian. vtk always swaps to native byte ordering.
>So your problem probably lies in the importer/reader not setting the
>DataByteOrder properly. something like
>reader->SetDataByteOrderToLittleEndian() should do it.
>-Jeff
>
>Sanatan Sahgal wrote:
>
>>
>>Because it is an extra overhead especially for large datasets and the app
>>will take a performance hit everytime I swap bytes for each dataset. As
>>stated in my first e-mail, I already know the problem can be solved by
>>doing byte swapping before feeding the data to VTK. I am looking for a
>>cleaner solution where the extra overhead of byte swapping can be avoided.
>>
>>I think the root cause of the problem is that VTK expects Big Endian data
>>on Little Endian machines. If VTK binaries run on computers with little
>>endian architecture then it is only natural to expect that the byte
>>ordering of the data will also be little endian. Why does the data have to
>>be in big endian format?
>>
>>Anyway, doesn't VTK eventually have to swap the data back to little endian
>>format for the Intel architecture? It just seems that on computers bound
>>to little endian architecture there is a lot of swapping necessary for no
>>reason at all. Perhaps I am missing something. I think the inconsistent
>>endianness is a major source of confusion especially for someone who has
>>no need of using the VTK reader classes.
>>
>>-Sanatan
>>
>>>
>>>Interesting, so why don't you change the type from big endian to little
>>>endian when you are reading the file during your 'pre-processing' steps.
>>>
>>>Anyway the whole byte swapping code is in vtkByteSwap
>>>
>>>http://www.vtk.org/doc/nightly/html/classvtkByteSwap.html
>>>
>>>HTH
>>>Mathieu
>>>
>>>Sanatan Sahgal wrote:
>>>
>>>>Mathieu,
>>>>
>>>>Thanks for the prompt response.
>>>>
>>>>The data is not coming from a file. Prior to the data hitting any of the
>>>>VTK classes it undergoes some pre-processing steps that I need to do.
>>>>The bottom line is that the data feed to VTK is not from a file. So,
>>>>using vtkImageReader class will not work. Is there any other way?
>>>>
>>>>thanks,
>>>>Sanatan
>>>>
>>>>>
>>>>>Sanatan,
>>>>>
>>>>> Since you are reading from a file you should rather have a look at
>>>>>the vtkImageReader class:
>>>>>
>>>>>http://www.vtk.org/doc/nightly/html/classvtkImageReader.html
>>>>>
>>>>>Since there is a member function that you need:
>>>>>
>>>>>vtkImageReader2::SetDataByteOrderToBigEndian()
>>>>>
>>>>>HTH
>>>>>Mathieu
>>>>>
>>>>>Sanatan Sahgal wrote:
>>>>>
>>>>>>Hello,
>>>>>>
>>>>>>I am using VTK on an Intel platform running Windows XP professional. I
>>>>>>have a 2 bytes per pixel grayscale image which I wish to display on
>>>>>>the screen using VTK.
>>>>>>
>>>>>>My image raw data is in little endian format and when I feed it to VTK
>>>>>>I see garbage on the screen because VTK seems to expect it in big
>>>>>>endian format. If I swap the bytes and then feed it to VTK the image
>>>>>>shows up correctly on my screen.
>>>>>>
>>>>>>I don't want this extra overhead of swapping the bytes. I want VTK to
>>>>>>recognize the raw little endian data just as it is. Is there any way
>>>>>>to tell VTK that my data is in little endian format and it should read
>>>>>>it as such?
>>>>>>
>>>>>>I am using the vtkImageData class. I feed data to the imageData
>>>>>>instance as follows:
>>>>>>imageData->GetPointData()->SetScalars(pixelArrayVtk);
>>>>>>
>>>>>>The pixelArrayVtk instance is of type vtkDataArray and it is setup as
>>>>>>follows:
>>>>>>pixelArrayVtk = CreateVtkDataArray(); //Creates instance of specific
>>>>>>VtkDataArray type. Example: vtkShortArray::New()
>>>>>>pixelArrayVtk->SetVoidArray(imageRawData, totalSamples, 1);
>>>>>>
>>>>>>The imageRawData parameter is a pointer to the memory location which
>>>>>>contains the raw image data in little endian format.
>>>>>>
>>>>>>Any help with this issue is appreciated.
>>>>>>
>>>>>>thanks,
>>>>>>Sanatan
>>>>>>
>>>>>>
>>>>>>_______________________________________________
>>>>>>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
>>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>
>>
>>_______________________________________________
>>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