From e66693e6106d6fb9c2d16e36f29fc17336fddb59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C5=BEenan=20Zuki=C4=87?= Date: Tue, 8 Dec 2020 13:34:39 -0500 Subject: [PATCH 1/2] ENH: add a convenience function WriteImage --- .../IO/ImageBase/include/itkImageFileWriter.h | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/Modules/IO/ImageBase/include/itkImageFileWriter.h b/Modules/IO/ImageBase/include/itkImageFileWriter.h index d3157b63317..074527a2d7f 100644 --- a/Modules/IO/ImageBase/include/itkImageFileWriter.h +++ b/Modules/IO/ImageBase/include/itkImageFileWriter.h @@ -235,6 +235,63 @@ class ITK_TEMPLATE_EXPORT ImageFileWriter : public ProcessObject int m_CompressionLevel{ -1 }; bool m_UseInputMetaDataDictionary{ true }; }; + + +/** Convenience function for writing an image. */ +template +ITK_TEMPLATE_EXPORT void +WriteImage(const TImage * image, const char * filename, bool compress = false) +{ + using WriterType = ImageFileWriter; + typename WriterType::Pointer writer = WriterType::New(); + writer->SetInput(image); + writer->SetFileName(filename); + writer->SetUseCompression(compress); + writer->Update(); +} +template +ITK_TEMPLATE_EXPORT void +WriteImage(const SmartPointer image, const char * filename, bool compress = false) +{ + WriteImage(image.GetPointer(), filename, compress); +} +template +ITK_TEMPLATE_EXPORT void +WriteImage(TImage * image, const char * filename, bool compress = false) +{ + const TImage * constImage = image; + WriteImage(constImage, filename, compress); +} +template +ITK_TEMPLATE_EXPORT void +WriteImage(SmartPointer image, const char * filename, bool compress = false) +{ + WriteImage(image.GetPointer(), filename, compress); +} +template +ITK_TEMPLATE_EXPORT void +WriteImage(const TImage * image, const std::string & filename, bool compress = false) +{ + WriteImage(image, filename.c_str(), compress); +} +template +ITK_TEMPLATE_EXPORT void +WriteImage(const SmartPointer image, const std::string & filename, bool compress = false) +{ + WriteImage(image, filename.c_str(), compress); +} +template +ITK_TEMPLATE_EXPORT void +WriteImage(TImage * image, const std::string & filename, bool compress = false) +{ + WriteImage(image, filename.c_str(), compress); +} +template +ITK_TEMPLATE_EXPORT void +WriteImage(SmartPointer image, const std::string & filename, bool compress = false) +{ + WriteImage(image, filename.c_str(), compress); +} } // end namespace itk #ifndef ITK_MANUAL_INSTANTIATION From fc3c8d1aba2238a7854db1d731db1cb20bf32b81 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 WriteImage convenience function in Core/Common/test Reduced boilerplate code by calling the convenience function. --- .../Common/test/itkImageDuplicatorTest2.cxx | 6 +----- .../test/itkImageRandomIteratorTest2.cxx | 8 ++------ .../test/itkStreamingImageFilterTest3.cxx | 8 +------- ...kSymmetricSecondRankTensorImageReadTest.cxx | 9 +-------- ...etricSecondRankTensorImageWriteReadTest.cxx | 9 +-------- ...itkN4BiasFieldCorrectionImageFilterTest.cxx | 18 ------------------ 6 files changed, 6 insertions(+), 52 deletions(-) diff --git a/Modules/Core/Common/test/itkImageDuplicatorTest2.cxx b/Modules/Core/Common/test/itkImageDuplicatorTest2.cxx index 3fd1d1c8e79..e1d69875b3c 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::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..b0d313553ad 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::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..a68637f7093 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::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..1497f29bee6 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::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..1a750a34fb8 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::WriteImage(tensorImageInput, av[1]); } catch (const itk::ExceptionObject & excp) { diff --git a/Modules/Filtering/BiasCorrection/test/itkN4BiasFieldCorrectionImageFilterTest.cxx b/Modules/Filtering/BiasCorrection/test/itkN4BiasFieldCorrectionImageFilterTest.cxx index 8031e9b87e4..dac309345d3 100644 --- a/Modules/Filtering/BiasCorrection/test/itkN4BiasFieldCorrectionImageFilterTest.cxx +++ b/Modules/Filtering/BiasCorrection/test/itkN4BiasFieldCorrectionImageFilterTest.cxx @@ -62,24 +62,6 @@ class CommandIterationUpdate : public itk::Command } }; -template -void -WriteImage(const TImage * out, const char * filename) -{ - using WriterType = itk::ImageFileWriter; - typename WriterType::Pointer w = WriterType::New(); - w->SetInput(out); - w->SetFileName(filename); - try - { - w->Update(); - } - catch (const itk::ExceptionObject & error) - { - std::cerr << error << std::endl; - } -} - template TValue Convert(std::string optionString)