[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/