#include #include "vtkObjectFactory.h" //#include #include #include #include //---------------------------------------------------------------------------- vtkStandardNewMacro( vtkMetaImageData ); vtkCxxRevisionMacro(vtkMetaImageData, "$Revision: 1.4 $"); #ifdef vtkDataManagement_USE_ITK #include #include #include #include #endif //---------------------------------------------------------------------------- vtkMetaImageData::vtkMetaImageData() { #ifdef vtkDataManagement_USE_ITK itk::AnalyzeImageIOFactory::RegisterOneFactory(); itk::GDCMImageIOFactory::RegisterOneFactory(); this->ComponentType = itk::ImageIOBase::UNKNOWNCOMPONENTTYPE; m_ItkImage = NULL; m_ItkConverter = ItkConverterType::New(); #endif this->Type = vtkMetaDataSet::VTK_META_IMAGE_DATA; } //---------------------------------------------------------------------------- vtkMetaImageData::~vtkMetaImageData() { } //---------------------------------------------------------------------------- void vtkMetaImageData::Initialize (void) { //nothing to do } //---------------------------------------------------------------------------- vtkImageData* vtkMetaImageData::GetImageData (void) const { if (!this->DataSet) return NULL; return vtkImageData::SafeDownCast (this->DataSet); } //---------------------------------------------------------------------------- void vtkMetaImageData::Read (const char* filename) { #ifndef vtkDataManagement_USE_ITK vtkErrorMacro(<<"cannot read file without ITK"< RealReaderType; RealReaderType::Pointer reader = RealReaderType::New(); reader->SetFileName(filename); try { std::cout<<"reading "<Update(); std::cout<<"done."<SetDataSetAsItkImage(reader->GetOutput()); this->LinkFilters(); // remember the path of the file this->SetFilePath ((vtksys::SystemTools::GetFilenamePath (filename)).c_str()); #endif } //---------------------------------------------------------------------------- void vtkMetaImageData::Write (const char* filename) { #ifndef vtkDataManagement_USE_ITK vtkErrorMacro(<<"cannot write file without ITK"<GetItkImage().IsNull()) { vtkErrorMacro(<<"No data to save"); throw vtkErrorCode::UserError; } // ITK stuff to be able to write analyze format itk::Matrix cosines; cosines[0][0]= 1; cosines[0][1]= 0; cosines[0][2]= 0; cosines[1][0]= 0; cosines[1][1]=-1; cosines[1][2]= 0; cosines[2][0]= 0; cosines[2][1]= 0; cosines[2][2]= 1; this->GetItkImage()->SetDirection(cosines); typedef FloatImageType RealImageType; typedef itk::ImageFileWriter RealWriterType; RealWriterType::Pointer writer = RealWriterType::New(); writer->SetFileName(filename); writer->SetInput(this->GetItkImage()); try { std::cout<<"writing "<Write(); std::cout<<"done."<SetFilePath ((vtksys::SystemTools::GetFilenamePath (filename)).c_str()); #endif } void vtkMetaImageData::LinkFilters (void) { this->Superclass::LinkFilters(); #ifdef vtkDataManagement_USE_ITK vtkImageData* c_image = this->GetImageData(); if (c_image) { m_ItkConverter->SetInput (c_image); } #endif } //---------------------------------------------------------------------------- unsigned int vtkMetaImageData::CanReadFile (const char* filename) { #ifndef vtkDataManagement_USE_ITK return 0; #else typedef itk::Image ShortImageType; typedef itk::ImageFileReader ImageReaderType; ImageReaderType::Pointer reader = ImageReaderType::New(); reader->SetFileName (filename); try { reader->Update(); return 1; } catch (itk::ExceptionObject &e) { std::cerr << e; return 0; } #endif return 0; } #ifdef vtkDataManagement_USE_ITK void vtkMetaImageData::SetDataSetAsItkImage(vtkMetaImageData::FloatImageType::Pointer image) { if (image.IsNull()) return; typedef itk::ImageToVTKImageFilter ConverterType; ConverterType::Pointer converter = ConverterType::New(); converter->SetInput (image); try { converter->Update(); } catch(itk::ExceptionObject &e) { std::cerr << e; vtkErrorMacro(<<"error when linking filters"<DeepCopy(converter->GetOutput()); this->SetDataSet (input); input->Delete(); this->LinkFilters(); } vtkMetaImageData::FloatImageType::Pointer vtkMetaImageData::GetItkImage() { if (!this->GetDataSet()) return NULL; try { m_ItkConverter->Update(); } catch(itk::ExceptionObject &e) { std::cerr << e; vtkErrorMacro(<<"error when converting"<GetOutput(); return m_ItkImage; } #endif // //---------------------------------------------------------------------------- // void vtkMetaImageData::Read (const char* filename) // { // #ifndef vtkDataManagement_USE_ITK // std::cerr<<"ITK not used : cannot read any image..."< d_ImageType; // typedef itk::ImageFileReader d_ReaderType; // d_ReaderType::Pointer d_reader = d_ReaderType::New(); // d_reader->SetFileName(filename); // try // { // d_reader->Update(); // } // catch(itk::ExceptionObject &e) // { // std::cerr << e; // throw itk::ExceptionObject(__FILE__,__LINE__,"Error in vtkMetaImageData::Read "); // } // // then set the component type to use // this->SetComponentType (d_reader->GetImageIO()->GetComponentType()); // // check if the image can be read // if (this->GetComponentType() == itk::ImageIOBase::UNKNOWNCOMPONENTTYPE) // { // std::cerr << "Unknown component type !" << std::endl; // throw itk::ExceptionObject(__FILE__,__LINE__,"Error in vtkMetaImageData::Read "); // } // if(d_reader->GetImageIO()->GetPixelType() != itk::ImageIOBase::SCALAR) // { // std::cerr << "Only scalar images can be read" << std::endl; // throw itk::ExceptionObject(__FILE__,__LINE__,"Error in vtkMetaImageData::Read "); // } // // finally read the image : try all types // if (this->GetComponentType() == itk::ImageIOBase::UCHAR) // { // typedef itk::Image RealImageType; // ITK_READ_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::CHAR) // { // typedef itk::Image RealImageType; // ITK_READ_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::USHORT) // { // typedef itk::Image RealImageType; // ITK_READ_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::SHORT) // { // typedef itk::Image RealImageType; // ITK_READ_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::UINT) // { // typedef itk::Image RealImageType; // ITK_READ_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::INT) // { // typedef itk::Image RealImageType; // ITK_READ_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::ULONG) // { // typedef itk::Image RealImageType; // ITK_READ_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::LONG) // { // typedef itk::Image RealImageType; // ITK_READ_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::FLOAT) // { // typedef itk::Image RealImageType; // ITK_READ_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::DOUBLE) // { // typedef itk::Image RealImageType; // ITK_READ_IMAGE; // } // else // { // typedef itk::Image RealImageType; // ITK_READ_IMAGE; // } // #endif // // remember the path of the file // this->SetFilePath ((vtksys::SystemTools::GetFilenamePath (filename)).c_str()); // } // //---------------------------------------------------------------------------- // void vtkMetaImageData::Write (const char* filename) // { // #ifndef vtkDataManagement_USE_ITK // std::cout<<"ITK not used : cannot write any image..."<GetImageData()) // { // std::cerr << "no image in metadataset !" <GetComponentType() == itk::ImageIOBase::UNKNOWNCOMPONENTTYPE) // { // std::cerr << "Unknown component type !" << std::endl; // throw itk::ExceptionObject(__FILE__,__LINE__,"Error in vtkMetaImageData::Write "); // } // // finally save it in the right type. // if (this->GetComponentType() == itk::ImageIOBase::UCHAR) // { // typedef itk::Image RealImageType; // ITK_WRITE_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::CHAR) // { // typedef itk::Image RealImageType; // ITK_WRITE_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::USHORT) // { // typedef itk::Image RealImageType; // ITK_WRITE_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::SHORT) // { // typedef itk::Image RealImageType; // ITK_WRITE_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::UINT) // { // typedef itk::Image RealImageType; // ITK_WRITE_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::INT) // { // typedef itk::Image RealImageType; // ITK_WRITE_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::ULONG) // { // typedef itk::Image RealImageType; // ITK_WRITE_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::LONG) // { // typedef itk::Image RealImageType; // ITK_WRITE_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::FLOAT) // { // typedef itk::Image RealImageType; // ITK_WRITE_IMAGE; // } // else if (this->GetComponentType() == itk::ImageIOBase::DOUBLE) // { // typedef itk::Image RealImageType; // ITK_WRITE_IMAGE; // } // else // { // typedef itk::Image RealImageType; // ITK_WRITE_IMAGE; // } // #endif // // remember the path of the file // this->SetFilePath ((vtksys::SystemTools::GetFilenamePath (filename)).c_str()); // }