[vtkusers] How does one enforce recognition of little endian data in VTK?
Jeff Lee
jeff at cdnorthamerica.com
Mon May 2 15:47:35 EDT 2005
I meant 4-bytes...
Jeff Lee wrote:
>
>
> Sanatan Sahgal wrote:
>
>> 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?
>
>
> oh, sorry I didn't read carefully enough. I don't think this is a
> byte-swap issue, but a datatype issue. first, vtkImageData has some
> methods to set the ScalarType - which one are you using? It should
> match the type returned from your CreateVtkDataArray. The fact that
> it works when you swap bytes is probably because by default, vtk is
> expecting a Float type (4 bits) and you are perhaps passing in a
> short? Try setting the scalarType and see what happens...
> -J
>
>>
>> -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
>>>>
>>>>
>>
>>
>>
> _______________________________________________
> 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