void SetOutputNames( typename WriterType::Pointer writer, const std::string& baseFileName, unsigned int numberOfImages ) { if( numberOfImages > 1 ) { itk::NumericSeriesFileNames::Pointer numericFileNameWriter = itk::NumericSeriesFileNames::New(); std::string finalFileName = baseFileName; std::string::size_type pos = baseFileName.find_last_of(".",baseFileName.length()-1); if(pos==std::string::npos) finalFileName.append(".%d.png"); else finalFileName.insert(pos,".%d"); MITK_DEBUG << "Filename: " << finalFileName; numericFileNameWriter->SetEndIndex(numberOfImages); numericFileNameWriter->SetSeriesFormat(finalFileName.c_str()); numericFileNameWriter->Modified(); writer->SetFileNames(numericFileNameWriter->GetFileNames()); } // if the given image is an 2D-png image, do not use the numericFileNameWriter // to generate the name, since it alters the fileName given as parameter else { writer->SetFileName( baseFileName.c_str() ); } }
void operator()( const Parameter ¶m ) { OSLM_DEBUG( "itk::ImageSeriesWriter with PIXELTYPE "<< fwTools::DynamicType::string<PIXELTYPE>() ); ::fwData::Image::sptr image = param.m_dataImage; // VAG attention : ImageFileReader ne notifie AUCUNE progressEvent mais son ImageIO oui!!!! mais ImageFileReader ne permet pas de l'atteindre // car soit mis a la mano ou alors construit lors de l'Update donc trop tard // Il faut dont creer une ImageIO a la mano (*1*): affecter l'observation sur IO (*2*) et mettre le IO dans le reader (voir *3*) // Reader IO (*1*) typename itk::ImageIOBase::Pointer imageIOWrite = itk::ImageIOFactory::CreateImageIO( "image.jpg", itk::ImageIOFactory::WriteMode); assert( imageIOWrite.IsNotNull() ); // create writer typedef itk::Image< PIXELTYPE, 3> itkImageType; typedef itk::Image< unsigned char, 2 > Image2DType; typedef typename itk::ImageSeriesWriter< itkImageType, Image2DType > WriterType; typename WriterType::Pointer writer = WriterType::New(); // set observation (*2*) itk::LightProcessObject::Pointer castHelper= (itk::LightProcessObject *)(imageIOWrite.GetPointer()); assert( castHelper.IsNotNull() ); Progressor progress(castHelper, param.m_fwWriter, param.m_filename); // create itk Image typename itkImageType::Pointer itkImage = ::fwItkIO::itkImageFactory<itkImageType>( image ); typedef ::itk::IntensityWindowingImageFilter< itkImageType, itkImageType > RescaleFilterType; typename RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New(); double min, max; ::fwData::Composite::sptr poolTF; poolTF = image->getField< ::fwData::Composite>( ::fwComEd::Dictionary::m_transferFunctionCompositeId ); if(poolTF) { ::fwData::Composite::iterator iter = poolTF->find(::fwData::TransferFunction::s_DEFAULT_TF_NAME); if(iter != poolTF->end()) { ::fwData::TransferFunction::sptr tf; tf = ::fwData::TransferFunction::dynamicCast(iter->second); min = tf->getWLMinMax().first; max = tf->getWLMinMax().second; } } else { ::fwComEd::fieldHelper::MedicalImageHelpers::getMinMax(image, min, max); } rescaleFilter->SetWindowMinimum( min ); rescaleFilter->SetWindowMaximum( max ); rescaleFilter->SetOutputMinimum( 0 ); rescaleFilter->SetOutputMaximum( 255 ); rescaleFilter->InPlaceOff(); rescaleFilter->SetInput( itkImage ); rescaleFilter->Update(); writer->SetInput( rescaleFilter->GetOutput() ); typedef itk::NumericSeriesFileNames NameGeneratorType; NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New(); std::string format = param.m_filename; format += "/%04d.jpg"; nameGenerator->SetSeriesFormat( format.c_str() ); nameGenerator->SetStartIndex( 1 ); nameGenerator->SetEndIndex( image->getSize()[2] ); nameGenerator->SetIncrementIndex( 1 ); writer->SetFileNames( nameGenerator->GetFileNames() ); writer->SetImageIO( imageIOWrite ); // save image; writer->Update(); }