Mercurial > hg > orthanc
diff OrthancFramework/Sources/Images/ImageProcessing.cpp @ 4083:26efd0404d97 framework
integration mainline->framework
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 23 Jun 2020 07:39:42 +0200 |
parents | Core/Images/ImageProcessing.cpp@2e1564f57542 Core/Images/ImageProcessing.cpp@259c33759937 |
children | bf7b9edf6b81 |
line wrap: on
line diff
--- a/OrthancFramework/Sources/Images/ImageProcessing.cpp Mon Jun 22 19:04:45 2020 +0200 +++ b/OrthancFramework/Sources/Images/ImageProcessing.cpp Tue Jun 23 07:39:42 2020 +0200 @@ -2525,4 +2525,37 @@ FitSize(*target, source); return target.release(); } + + + ImageAccessor* ImageProcessing::FitSizeKeepAspectRatio(const ImageAccessor& source, + unsigned int width, + unsigned int height) + { + std::unique_ptr<ImageAccessor> target(new Image(source.GetFormat(), width, height, false)); + Set(*target, 0); + + if (width != 0 && + height != 0 && + source.GetWidth() != 0 && + source.GetHeight() != 0) + { + float ratio = std::min(static_cast<float>(width) / static_cast<float>(source.GetWidth()), + static_cast<float>(height) / static_cast<float>(source.GetHeight())); + + unsigned int resizedWidth = static_cast<unsigned int>( + boost::math::iround(ratio * static_cast<float>(source.GetWidth()))); + + unsigned int resizedHeight = static_cast<unsigned int>( + boost::math::iround(ratio * static_cast<float>(source.GetHeight()))); + + std::unique_ptr<ImageAccessor> resized(FitSize(source, resizedWidth, resizedHeight)); + + ImageAccessor region; + target->GetRegion(region, (width - resizedWidth) / 2, + (height - resizedHeight) / 2, resizedWidth, resizedHeight); + Copy(region, *resized); + } + + return target.release(); + } }