# Convert16BitsTo8Bits.cxx

    /*=========================================================================

      Program: GDCM (Grassroots DICOM). A DICOM library
      Module:  $URL$

      Copyright (c) 2006-2010 Mathieu Malaterre
      All rights reserved.
      See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.

         This software is distributed WITHOUT ANY WARRANTY; without even
         the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
         PURPOSE.  See the above copyright notice for more information.

    =========================================================================*/
    #include "vtkGDCMImageReader.h"
    #include "vtkGDCMImageWriter.h"
    #include "vtkImageData.h"
    #include "vtkImageCast.h"

    #include "gdcmTesting.h"
    // The following file is 16/16/15 but the scalar range of the image is [0,192]
    // it could be safely stored as 8bits instead:
    // gdcmData/012345.002.050.dcm

    int main(int, char *[])
    {
      const char *directory = gdcm::Testing::GetDataRoot();
      if(!directory) return 1;
      std::string file = std::string(directory) + "/012345.002.050.dcm";
      std::cout << file << std::endl;

      vtkGDCMImageReader *reader = vtkGDCMImageReader::New();
      reader->SetFileName( file.c_str() );
      reader->Update();
      //reader->GetOutput()->Print( std::cout );

      vtkImageCast *cast = vtkImageCast::New();
      cast->SetInput( reader->GetOutput() );
      cast->SetOutputScalarTypeToUnsignedChar();

      vtkGDCMImageWriter *writer = vtkGDCMImageWriter::New();
      writer->SetFileName( "/tmp/cast.dcm" );
      writer->SetInput( cast->GetOutput() );
      writer->SetImageFormat( reader->GetImageFormat() );
      writer->SetMedicalImageProperties( reader->GetMedicalImageProperties() );
      writer->SetDirectionCosines( reader->GetDirectionCosines() );
      writer->SetShift( reader->GetShift() );
      writer->SetScale( reader->GetScale() );
      writer->Write();

      reader->Delete();
      cast->Delete();
      writer->Delete();

      return 0;
    }