# HG changeset patch # User Sebastien Jodogne # Date 1572019767 -7200 # Node ID fab5777f4dd46c6741da1eb3e891fd261fdab6c8 # Parent dabe17e23e231e597a06c0b778bf40c681e67ab9 ImageProcessing::FitSize() diff -r dabe17e23e23 -r fab5777f4dd4 Core/Images/ImageProcessing.cpp --- a/Core/Images/ImageProcessing.cpp Tue Oct 22 17:30:43 2019 +0200 +++ b/Core/Images/ImageProcessing.cpp Fri Oct 25 18:09:27 2019 +0200 @@ -2221,4 +2221,57 @@ SeparableConvolution(image, kernel, 2, kernel, 2); } + + + void ImageProcessing::FitSize(ImageAccessor& target, + const ImageAccessor& source) + { + if (target.GetWidth() == 0 || + target.GetHeight() == 0) + { + return; + } + + if (source.GetWidth() == target.GetWidth() && + source.GetHeight() == target.GetHeight()) + { + Copy(target, source); + return; + } + + Set(target, 0); + + // Preserve the aspect ratio + float cw = static_cast(source.GetWidth()); + float ch = static_cast(source.GetHeight()); + float r = std::min( + static_cast(target.GetWidth()) / cw, + static_cast(target.GetHeight()) / ch); + + unsigned int sw = std::min(static_cast(boost::math::iround(cw * r)), target.GetWidth()); + unsigned int sh = std::min(static_cast(boost::math::iround(ch * r)), target.GetHeight()); + Image resized(target.GetFormat(), sw, sh, false); + + //ImageProcessing::SmoothGaussian5x5(source); + ImageProcessing::Resize(resized, source); + + assert(target.GetWidth() >= resized.GetWidth() && + target.GetHeight() >= resized.GetHeight()); + unsigned int offsetX = (target.GetWidth() - resized.GetWidth()) / 2; + unsigned int offsetY = (target.GetHeight() - resized.GetHeight()) / 2; + + ImageAccessor region; + target.GetRegion(region, offsetX, offsetY, resized.GetWidth(), resized.GetHeight()); + ImageProcessing::Copy(region, resized); + } + + + ImageAccessor* ImageProcessing::FitSize(const ImageAccessor& source, + unsigned int width, + unsigned int height) + { + std::auto_ptr target(new Image(source.GetFormat(), width, height, false)); + FitSize(*target, source); + return target.release(); + } } diff -r dabe17e23e23 -r fab5777f4dd4 Core/Images/ImageProcessing.h --- a/Core/Images/ImageProcessing.h Tue Oct 22 17:30:43 2019 +0200 +++ b/Core/Images/ImageProcessing.h Fri Oct 25 18:09:27 2019 +0200 @@ -165,5 +165,12 @@ size_t verticalAnchor); void SmoothGaussian5x5(ImageAccessor& image); + + void FitSize(ImageAccessor& target, + const ImageAccessor& source); + + ImageAccessor* FitSize(const ImageAccessor& source, + unsigned int width, + unsigned int height); } }