[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