<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
  <title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
<font face="Helvetica, Arial, sans-serif">Hi Insight-Users,<br>
<br>
I have a question regarding the use of the ITK MetaImageIO to write a
vector pixel of signed char type. The pixel type I am trying to write
is itk::CovariantVector&lt; signed char, 2&gt;. Using the MetaImageIO
factory (ie. output filename has .mhd extension), the following
exception is thrown:<br>
<br>
itk::ExceptionObject (0129F0A4)<br>
Location: "bool __thiscall itk::ImageIOBase::SetPixelTypeInfo(const
class type_info &amp;)"<br>
File: ..\..\..\Code\IO\itkImageIOBase.cxx<br>
Line: 340<br>
Description: itk::ERROR: MetaImageIO(01778A80): Pixel type currently
not supported. typeid.name = class itk::CovariantVector&lt;signed
char,2&gt;<br>
<br>
If I change the type to signed short or char everything works fine. Is
there a specific reason the MetaImageIO factory classes do not support
writing signed char files? If not, how would I go about added support
for them? BTW: char is supported but not signed char, are they the
same? Does another IO factory support the writing of signed char vector
outputs?<br>
<br>
I have have a quick look in itkImageIOBase.cxx, but couldn't really
work out where to start.<br>
<br>
I have attached my source code below for your reference. My system is
as follows:<br>
&nbsp;&nbsp;&nbsp; Windows XP SP1<br>
&nbsp;&nbsp;&nbsp; CMake 2.4.2<br>
&nbsp;&nbsp;&nbsp; ITK 2.8.1<br>
&nbsp;&nbsp;&nbsp; VS8.0.50727.42<br>
<br>
Thanks for any help.<br>
<br>
Cheers<br>
<br>
Dan<br>
<br>
<br>
<font face="Courier New, Courier, monospace">#include "itkImage.h"<br>
#include "itkCovariantVector.h"<br>
#include "itkImageFileReader.h"<br>
#include "itkImageFileWriter.h"<br>
#include "itkGradientImageFilter.h"<br>
#include "itkVectorCastImageFilter.h"<br>
<br>
int main(int argc, char *argv[])<br>
{<br>
&nbsp;&nbsp;&nbsp; if (argc &lt; 3)<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; "Usage: " &lt;&lt; std::endl;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; argv[0];<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; " InputImageFilename";<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; " OutputImageFilename";<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; std::endl;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return EXIT_FAILURE;<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; // Set input variables<br>
&nbsp;&nbsp;&nbsp; char* InputImageFilename&nbsp; = argv[1];<br>
&nbsp;&nbsp;&nbsp; char* OutputImageFilename = argv[2];<br>
<br>
&nbsp;&nbsp;&nbsp; // Declare types<br>
&nbsp;&nbsp;&nbsp; const unsigned int Dimension = 2;<br>
&nbsp;&nbsp;&nbsp; typedef itk::Image&lt; unsigned char, Dimension &gt; InputImageType;<br>
&nbsp;&nbsp;&nbsp; typedef itk::CovariantVector&lt; signed char, Dimension &gt;
OutputPixelTye; // Works if changed to signed short<br>
&nbsp;&nbsp;&nbsp; typedef itk::Image&lt; OutputPixelTye, Dimension &gt;
OutputImageType;<br>
&nbsp;&nbsp;&nbsp; typedef itk::GradientImageFilter&lt; InputImageType &gt;
GradientFilterType;<br>
&nbsp;&nbsp;&nbsp; typedef GradientFilterType::OutputImageType GradientVectorImageType;<br>
&nbsp;&nbsp;&nbsp; typedef itk::VectorCastImageFilter&lt; GradientVectorImageType,
OutputImageType &gt; VectorCastFilterType;<br>
&nbsp;&nbsp;&nbsp; typedef itk::ImageFileReader&lt; InputImageType &gt; ReaderType;<br>
&nbsp;&nbsp;&nbsp; typedef itk::ImageFileWriter&lt; OutputImageType &gt; WriterType;<br>
<br>
&nbsp;&nbsp;&nbsp; try<br>
&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Read input image<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReaderType::Pointer reader = ReaderType::New();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader-&gt;SetFileName( InputImageFilename );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader-&gt;Update(); <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Compute gradient<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GradientFilterType::Pointer filterGrad =
GradientFilterType::New();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; filterGrad-&gt;SetInput( reader-&gt;GetOutput() );<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; filterGrad-&gt;Update();<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Cast<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; VectorCastFilterType::Pointer filterCast =
VectorCastFilterType::New();<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; filterCast-&gt;SetInput( filterGrad-&gt;GetOutput() );<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; filterCast-&gt;Update();<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Write output<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriterType::Pointer writer = WriterType::New();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer-&gt;SetFileName( OutputImageFilename );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer-&gt;SetInput( filterCast-&gt;GetOutput() );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer-&gt;Update();<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; catch (itk::ExceptionObject &amp; err)<br>
&nbsp;&nbsp;&nbsp; { <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; "ExceptionObject caught !" &lt;&lt;
std::endl; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; err &lt;&lt; std::endl; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return EXIT_FAILURE;<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; // Return<br>
&nbsp;&nbsp;&nbsp; return EXIT_SUCCESS;<br>
}<br>
</font><br>
</font>
</body>
</html>