From 1a8e5d388a1e1f90c61ac200acd0785a2edfc41b Mon Sep 17 00:00:00 2001 From: Niels Dekker Date: Fri, 6 Nov 2020 16:39:19 +0100 Subject: [PATCH 1/2] ENH: Add static ImageFileWriter<>::WriteImage(image, fileName) function Added an `itk::ImageFileWriter<>` specialization that has a static `WriteImage(image, fileName)` member function. Allows writing an image more easily. --- .../IO/ImageBase/include/itkImageFileWriter.h | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/Modules/IO/ImageBase/include/itkImageFileWriter.h b/Modules/IO/ImageBase/include/itkImageFileWriter.h index d3157b63317..ceab6e143de 100644 --- a/Modules/IO/ImageBase/include/itkImageFileWriter.h +++ b/Modules/IO/ImageBase/include/itkImageFileWriter.h @@ -82,7 +82,7 @@ class ITKIOImageBase_EXPORT ImageFileWriterException : public ExceptionObject * \sphinxexample{IO/ImageBase/WriteAnImage,Write An image} * \endsphinx */ -template +template class ITK_TEMPLATE_EXPORT ImageFileWriter : public ProcessObject { public: @@ -235,6 +235,32 @@ class ITK_TEMPLATE_EXPORT ImageFileWriter : public ProcessObject int m_CompressionLevel{ -1 }; bool m_UseInputMetaDataDictionary{ true }; }; + +template <> +class ImageFileWriter +{ +public: + ITK_DISALLOW_COPY_AND_MOVE(ImageFileWriter); + + ImageFileWriter() = delete; + ~ImageFileWriter() = delete; + + /** Writes an image to the specified file. Example: + \code + itk::ImageFileWriter<>::WriteImage(*imagePointer, outputFileName); + \endcode + */ + template + static void + WriteImage(const TInputImage & image, const std::string & fileName) + { + const auto writer = itk::ImageFileWriter::New(); + writer->SetFileName(fileName); + writer->SetInput(&image); + writer->Update(); + } +}; + } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION From 7c0cd30e1e2b9d4aa04be23051994debb866c2b8 Mon Sep 17 00:00:00 2001 From: Niels Dekker Date: Fri, 6 Nov 2020 16:48:09 +0100 Subject: [PATCH 2/2] STYLE: Use the static ImageFileWriter<>::WriteImage in Core/Common/test Reduced boilerplate code by calling the static `itk::ImageFileWriter<>` member function to write an image. --- Modules/Core/Common/test/itkImageDuplicatorTest2.cxx | 6 +----- Modules/Core/Common/test/itkImageRandomIteratorTest2.cxx | 8 ++------ .../Core/Common/test/itkStreamingImageFilterTest3.cxx | 8 +------- .../test/itkSymmetricSecondRankTensorImageReadTest.cxx | 9 +-------- .../itkSymmetricSecondRankTensorImageWriteReadTest.cxx | 9 +-------- 5 files changed, 6 insertions(+), 34 deletions(-) diff --git a/Modules/Core/Common/test/itkImageDuplicatorTest2.cxx b/Modules/Core/Common/test/itkImageDuplicatorTest2.cxx index 3fd1d1c8e79..1dfa9e20719 100644 --- a/Modules/Core/Common/test/itkImageDuplicatorTest2.cxx +++ b/Modules/Core/Common/test/itkImageDuplicatorTest2.cxx @@ -37,8 +37,6 @@ itkImageDuplicatorTest2(int argc, char * argv[]) using ReaderType = itk::ImageFileReader; ReaderType::Pointer reader = ReaderType::New(); - using WriterType = itk::ImageFileWriter; - WriterType::Pointer writer = WriterType::New(); using DuplicatorType = itk::ImageDuplicator; DuplicatorType::Pointer dup = DuplicatorType::New(); using AbsType = itk::AbsImageFilter; @@ -69,9 +67,7 @@ itkImageDuplicatorTest2(int argc, char * argv[]) dup->Update(); ImageType::ConstPointer dupImage = dup->GetOutput(); - writer->SetInput(dupImage); - writer->SetFileName(argv[2]); - writer->Update(); + itk::ImageFileWriter<>::WriteImage(*dupImage, argv[2]); std::cout << "Test SUCCESS" << std::endl; } catch (const itk::ExceptionObject & e) diff --git a/Modules/Core/Common/test/itkImageRandomIteratorTest2.cxx b/Modules/Core/Common/test/itkImageRandomIteratorTest2.cxx index d82e6eb5322..75fdc892866 100644 --- a/Modules/Core/Common/test/itkImageRandomIteratorTest2.cxx +++ b/Modules/Core/Common/test/itkImageRandomIteratorTest2.cxx @@ -41,12 +41,9 @@ itkImageRandomIteratorTest2(int argc, char * argv[]) using PixelType = unsigned long; using ImageType = itk::Image; - using WriterType = itk::ImageFileWriter; ImageType::Pointer image = ImageType::New(); - WriterType::Pointer writer = WriterType::New(); - ImageType::SizeType size; size[0] = 1000; @@ -84,9 +81,8 @@ itkImageRandomIteratorTest2(int argc, char * argv[]) ++counter; } - writer->SetInput(image); - writer->SetFileName(argv[1]); - writer->Update(); + + itk::ImageFileWriter<>::WriteImage(*image, argv[1]); if (argc > 4) { diff --git a/Modules/Core/Common/test/itkStreamingImageFilterTest3.cxx b/Modules/Core/Common/test/itkStreamingImageFilterTest3.cxx index 0c9a442e1ec..92df4ffd58b 100644 --- a/Modules/Core/Common/test/itkStreamingImageFilterTest3.cxx +++ b/Modules/Core/Common/test/itkStreamingImageFilterTest3.cxx @@ -64,13 +64,7 @@ itkStreamingImageFilterTest3(int argc, char * argv[]) streamer->SetNumberOfStreamDivisions(numberOfStreamDivisions); streamer->SetRegionSplitter(splitter); - - using WriterType = itk::ImageFileWriter; - WriterType::Pointer writer = WriterType::New(); - writer->SetFileName(outputFilename); - writer->SetInput(streamer->GetOutput()); - writer->Update(); - + itk::ImageFileWriter<>::WriteImage(*(streamer->GetOutput()), outputFilename); unsigned int expectedNumberOfStreams = splitter->GetNumberOfSplits(streamer->GetOutput()->GetLargestPossibleRegion(), numberOfStreamDivisions); diff --git a/Modules/Core/Common/test/itkSymmetricSecondRankTensorImageReadTest.cxx b/Modules/Core/Common/test/itkSymmetricSecondRankTensorImageReadTest.cxx index 8fb03701fc7..fb43d4e2d9b 100644 --- a/Modules/Core/Common/test/itkSymmetricSecondRankTensorImageReadTest.cxx +++ b/Modules/Core/Common/test/itkSymmetricSecondRankTensorImageReadTest.cxx @@ -82,16 +82,9 @@ itkSymmetricSecondRankTensorImageReadTest(int ac, char * av[]) ++itr; } - using MatrixWriterType = itk::ImageFileWriter; - - MatrixWriterType::Pointer matrixWriter = MatrixWriterType::New(); - - matrixWriter->SetInput(matrixImage); - matrixWriter->SetFileName(av[1]); - try { - matrixWriter->Update(); + itk::ImageFileWriter<>::WriteImage(*matrixImage, av[1]); } catch (const itk::ExceptionObject & excp) { diff --git a/Modules/Core/Common/test/itkSymmetricSecondRankTensorImageWriteReadTest.cxx b/Modules/Core/Common/test/itkSymmetricSecondRankTensorImageWriteReadTest.cxx index 9c1425bc428..25ed9ec39fe 100644 --- a/Modules/Core/Common/test/itkSymmetricSecondRankTensorImageWriteReadTest.cxx +++ b/Modules/Core/Common/test/itkSymmetricSecondRankTensorImageWriteReadTest.cxx @@ -67,16 +67,9 @@ itkSymmetricSecondRankTensorImageWriteReadTest(int ac, char * av[]) ++itr; } - using TensorWriterType = itk::ImageFileWriter; - - TensorWriterType::Pointer tensorWriter = TensorWriterType::New(); - - tensorWriter->SetInput(tensorImageInput); - tensorWriter->SetFileName(av[1]); - try { - tensorWriter->Update(); + itk::ImageFileWriter<>::WriteImage(*tensorImageInput, av[1]); } catch (const itk::ExceptionObject & excp) {