I need to scale down an image that has a height or width greater than a predefined pixel value.
I wrote some code that takes a look at the original image, checks to see if either the width, the height, or the height and width are greater than the Max Width/Max Height settings.
I now need to figure out what dimensions to resize to based on the max of the latter value.
For example: If the image is 900h x 300w
and the MAX Height is 700h
I will need to resize the height to 700
and the width to ????
<-- this is what I need to calculate..
Creating and saving the image file is simple, and outside the scope of this post:
// First I get the max height and width allowed:
int resizeMaxHeight = int.Parse(Utility.GetConfigValue("ResizeMaxHeight")); // in config: 700px
int resizeMaxWidth = int.Parse(Utility.GetConfigValue("ResizeMaxWidth")); // in config: 500px
// Save original:
try
{
filebase.SaveAs(savedFileName);
}
catch (System.IO.DirectoryNotFoundException ex)
{
Logger.Instance.LogException(ex, 0, "FileTransfer");
}
// Determin original dimensions:
Image image = System.Drawing.Image.FromFile(Server.MapPath(savedFileName));
int resizeHeight, resizeWidth;
bool doResize = true;
// both height and width are greater than the allowed height and width:
if (image.Width > resizeMaxWidth && image.Height > resizeMaxHeight)
{
if (image.Height > image.Width)
resizeHeight = resizeMaxHeight;
else
resizeWidth = resizeMaxWidth;
}
else if (image.Width > resizeMaxWidth)
{
// width is too great, but height is ok
resizeWidth = resizeMaxWidth;
}
else if (image.Height > resizeMaxHeight)
{
// height is too great, but width is ok
resizeHeight = resizeMaxHeight;
}
else
{
// image is ok size, don't resize:
doResize = false;
}
Create thumbnail: This is what I'm working now... not complete:
if (doResize)
{
ImageUtilities.ResizeImage(image, resizeWidth, resizeHeight);
}
The solution posted by Nathaniel actually fails if the image height is larger than the image width. The following example yields the correct result :
private Size ResizeFit(Size originalSize, Size maxSize)
{
var widthRatio = (double)maxSize.Width / (double)originalSize.Width;
var heightRatio = (double) maxSize.Height/(double) originalSize.Height;
var minAspectRatio = Math.Min(widthRatio, heightRatio);
if (minAspectRatio > 1)
return originalSize;
return new Size((int)(originalSize.Width*minAspectRatio), (int)(originalSize.Height*minAspectRatio));
}