[Insight-developers] TIFF Image compression -- defaults

Zachary Pincus zpincus at stanford.edu
Thu, 15 Apr 2004 20:49:10 -0700


Hello,

=10I am trying to write out uncompressed TIFF images to disk.=20
Unfortunately, the following construction doesn't work:

...
writer->SetFileName=10("foo.tiff")
writer->CompressionOff();
writer->Update();

This is because itk::TIFFImageIO does not use the m_UseCompression=20
member variable (defined in itk::ImageIOBase) to determine whether or=20
not to use compression.

Instead, one must use the following construction:

TIFFImageIO::Pointer io =3D TIFFImageIO::New();
writer->SetFileName(outputFilename);
io->SetCompressionToNoCompression();
writer->SetImageIO(io);
writer->Update();

While it's nice that one *can* control the TIFF compression at a very=20
fine-grained level with the SetCompression... methods on the=20
TIFFImageIO object, it would be good for the TIFFImageIO class to also=20=

respect the results of CompressionOff() calls.

Unfortunately, this sort of leaves ITK painted into the corner with=20
regard to default behavior. Specifically, in ITK, TIFFs are by default=20=

compressed with PACKBITS compression. However, by default an=20
ImageFiltWriter calls CompressionOff(). There appears to be no way to=20
have TiffImageIO *both* respect Compression[On|Off]() calls AND retain=20=

the current default behavior of ImageFileWriter and TIFFImageIO.

I suggest that it would be best to simply have TIFFImageIO objects=20
respect the m_UseCompression variable, and to automatically set=20
m_UseCompression to true when any SetCOmpressionTo... method is called.=20=

This would break code that relies on ITK writing PACKBITS-compressed=20
TIFFS by default, but wouldn't break any other code.

I have included diffs for a patch that does just this.

Thanks,

Zach Pincus

Department of Biochemistry and Program in Biomedical Informatics
Stanford University School of Medicine


diff itkTIFFImageIO.h itkTIFFImageIO-patch.h
112c112,128
<   itkSetMacro(Compression,int);
---
 > SetCompression(int compression) {
 >       m_Compression =3D compression;
 >
 >       // This If block isn't strictly necessary:
 >       // m_UseCompression =3D true; would be sufficient.
 >       // However, it reads strangely for=20
SetCompression(NoCompression) to
 >       // then set m_UseCompression to true.
 >       // Doing it this way is probaly also less likely to break in=20
the future.
 >       if (compression =3D=3D NoCompression)
 >         {
 >         m_UseCompression =3D false;
 >         }
 >       else
 >         {
 >         m_UseCompression =3D true;
 >         }
 > }

diff itkTIFFImageIO.cxx itkTIFFImageIO-patch.cxx
867c867,868
<   switch ( m_Compression )
---
 >
 >   if (m_UseCompression)
869,873c870,881
<   case TIFFImageIO::PackBits: compression =3D COMPRESSION_PACKBITS;=20
break;
<   case TIFFImageIO::JPEG:     compression =3D COMPRESSION_JPEG; break;
<   case TIFFImageIO::Deflate:  compression =3D COMPRESSION_DEFLATE;=20
break;
<   case TIFFImageIO::LZW:      compression =3D COMPRESSION_LZW; break;
<   default: compression =3D COMPRESSION_NONE;
---
 >     switch ( m_Compression )
 >       {
 >       case TIFFImageIO::PackBits: compression =3D =
COMPRESSION_PACKBITS;=20
break;
 >       case TIFFImageIO::JPEG:     compression =3D COMPRESSION_JPEG;=20=

break;
 >       case TIFFImageIO::Deflate:  compression =3D =
COMPRESSION_DEFLATE;=20
break;
 >       case TIFFImageIO::LZW:      compression =3D COMPRESSION_LZW;=20
break;
 >       default: compression =3D COMPRESSION_NONE;
 >       }
 >     }
 >   else
 >     {
 >     compression =3D COMPRESSION_NONE;=