[Insight-users] VTKImageIO bug + feature request (fix inside)
Mathieu Malaterre
Mathieu.Malaterre@creatis.insa-lyon.fr
Tue, 18 Mar 2003 19:33:09 +0100
Hi all,
I would like to know if there is any one of you that use VTK *binary*
files for storing data ?
I realized that the file reader/writer is working...at one condition
you don't try to load the file through VTK on a Little Endian Box (guess
what is my architecure ;)).
So I would like to know if this was done on purpose or not ? As VTK
Binary format (as defined in :
http://public.kitware.com/VTK/pdf/file-formats.pdf) are in *BIG ENDIAN*.
It should be easy to add the ByteWaping in the VTKImageIO.
That is to say in itkVTKImageIO.cxx, line 342:
file.read(static_cast<char*>(buffer), this->GetImageSizeInBytes());
int size = this->GetPixelSize();
switch( size )
{
case 2:
ByteSwapper<short>::SwapRangeFromSystemToBigEndian((short
*)buffer, this->GetImageSizeInComponents() );
break;
case 4:
ByteSwapper<float>::SwapRangeFromSystemToBigEndian((float
*)buffer, this->GetImageSizeInComponents() );
break;
case 6:
ByteSwapper<double>::SwapRangeFromSystemToBigEndian((double
*)buffer, this->GetImageSizeInComponents() );
break;
}
Same idea line 420 for writting...
---
In requested feature I would like to add the handling of tag
'COLOR_SCALARS'. Sometime this tag is used even if the scalar range is
between 0 and 255.
For example this pipeline:
vtkTIFFReader -> vtkStructuredPointsWriter
leads to a structured points image with COLOR_SCALARS instead of SCALARS.
This could be -almost- easily fixed with:
Go in itkVTKImageIO.cxx, line 258:
else if ( text.find("COLOR_SCALARS") < text.length() ||
text.find("color_scalars") < text.length() )
{
readScalars = true;
int myscal;
sscanf(line, "%*s %*s %d", &myscal);
if ( myscal == 1 )
{
if ( this->GetFileType() == ASCII ) {
SetPixelType(FLOAT);
SetComponentType(FLOAT);
}
else {
SetPixelType(UCHAR);
SetComponentType(UCHAR);
}
}
else
{
itkExceptionMacro(<<"UNKNOWN");
}
}
else if ( text.find("SCALARS") < text.length() ||
text.find("scalars") < text.length() )
If someone would like to commit this modification. He'll has to take
care of line 322/323:
322: file.getline(line,255);
323: text = line;
This is only needed to get rid of LOOKUP_TABLE but not in the case of
COLORS_SCALAR
---
For people urged to try it you'll find the c++ file here:
http://www.creatis.insa-lyon.fr/~malaterre/vtk/itkVTKImageIO.cxx
HTH,
mathieu
--
Mathieu Malaterre
CREATIS
28 Avenue du Doyen LEPINE
B.P. Lyon-Montchat
69394 Lyon Cedex 03
http://www.creatis.insa-lyon.fr/~malaterre/