Algorithm to resize image and maintain aspect ratio to fit iPhone Algorithm to resize image and maintain aspect ratio to fit iPhone php php

Algorithm to resize image and maintain aspect ratio to fit iPhone


Maybe a slightly shorter routine would be:

// Calculate resize ratios for resizing float ratioW = targetWidth / oldWidth; float ratioH = targetHeight / oldHeight;// smaller ratio will ensure that the image fits in the viewfloat ratio = ratioW < ratioH?ratioW:ratioH;newWidth = oldWidth*ratio;newHeight = oldHeight*ratio;

Obviously if the ratio is > 1, then it's enlarging, if < 1 then it's shrinking.


I think the following should give you the idea. It's not in any particular language, but rather a C-like pseudo code.

shortSideMax = 640;longSideMax = 960;function Resize(image){    if (image.width >= image.height)    {        if (image.width <= longSideMax && image.height <= shortSideMax)            return image;  // no resizing required        wRatio = longSideMax / image.width;        hRatio = shortSideMax / image.height;    }    else    {        if (image.height <= longSideMax && image.width <= shortSideMax)            return image; // no resizing required        wRatio = shortSideMax / image.width;        hRatio = longSideMax / image.height;    }    // hRatio and wRatio now have the scaling factors for height and width.    // You want the smallest of the two to ensure that the resulting image    // fits in the desired frame and maintains the aspect ratio.    resizeRatio = Min(wRatio, hRatio);    newHeight = image.Height * resizeRatio;    newWidth = image.Width * resizeRatio;    // Now call function to resize original image to [newWidth, newHeight]    // and return the result.}

The efficiency of this code, or what you have, won't be an issue. The time it takes to actually resize the image will dwarf the time it takes to do a couple of comparisons, two divides, and two multiplies.

Is this a "more mathematical" way to do it? I suppose, in that it collapses your four cases into two. But the approach is essentially the same.


Below, the simplest way I know to keep proportions. Hope it helps.

Javascript

function resize(width, height, maxWidth, maxHeight) {    var ratio = Math.min(maxWidth / width, maxHeight / height);    var newWidth = ratio * width;    var newHeight = ratio * height;    console.log(newWidth + ' ' + newHeight); // Test    // Process resizing...}resize(1280, 1024, 600, 300);

PHP

function resize($width, $height, $maxWidth, $maxHeight) {    $ratio = min(array($maxWidth / $width, $maxHeight / $height));    $newWidth = $ratio * $width;    $newHeight = $ratio * $height;    echo $newWidth . ' ' . $newHeight; // Test    // Process resizing...}resize(1600, 1280, 150, 150);