insertusernamehere
insertusernamehere

Reputation: 23580

Calculating new image size - how can I make this more efficient/shorter

I have a script, that's pretty huge for an actual simple task, because it's nested very often. What it does is this:

This is the script:

//example values, whereas 'new' is the maximum range for the new image
$dimensions = array(1920,1200);
$dimensionsNew  = array(160, 0);
// percentage the image must be scaled
$percentages    = array(0,0);

//calculate scale range
if ($dimensionsNew[0] != 0) $percentages[0] = $dimensions[0] / $dimensionsNew[0];
if ($dimensionsNew[1] != 0) $percentages[1] = $dimensions[1] / $dimensionsNew[1];

//get new dimensions
if ( ($dimensions[0] <= $dimensionsNew[0]) && ($dimensions[1] <= $dimensionsNew[1]) ) {
    $dimensionsNew[0]       = $dimensions[0];
    $dimensionsNew[1]       = $dimensions[1];
} elseif ($dimensionsNew[0] == 0) {
    if ($dimensions[1] <= $dimensionsNew[1]) {
        $dimensionsNew[0]   = $dimensions[0];
        $dimensionsNew[1]   = $dimensions[1];
    } else {
        $dimensionsNew[0]   = ceil($dimensions[0] / $percentages[1]);
    }
} elseif ($dimensionsNew[1] == 0) {
    if ($dimensions[0] <= $dimensionsNew[0]) {
        $dimensionsNew[0]   = $dimensions[0];
        $dimensionsNew[1]   = $dimensions[1];
    } else {
        $dimensionsNew[1]   = ceil($dimensions[1] / $percentages[0]);
    }
} elseif ($percentages[0] < $percentages[1]) {
    $dimensionsNew[1]       = ceil($dimensions[1] / $percentages[1]);
} else {
    $dimensionsNew[0]       = ceil($dimensions[0] / $percentages[0]);
}

It does what it should do. But is there an easier way of doing this? I think I looked at this code too often and can't find a way to optimize.

Upvotes: 3

Views: 192

Answers (1)

Robbie
Robbie

Reputation: 17720

You should use "min" on the rations of the sizes to work out the scale required. In this is >1 then no shrinking ncessary, if <1 then shrink by the right amount

//example values, whereas 'new' is the maximum range for the new image
$dimensions = array(1920,1200);
$dimensionsNew  = array(160, 0);   // NOTE: 0 won't work, but it's your example ;)

// What scale do we need to go to
$scaleRequired = min($dimensionsNew[0] / $dimensions[0], $dimensionsNew[1] / $dimensions[1]);

if ($scaleRequired < 1) {
    $finalDimensions = array (
         $dimensions[0] * $scaleRequired, 
         $dimensions[1] * $scaleRequired);

    // Resize to $finalDimensions

} else {
    // Do nothing
}

Upvotes: 2

Related Questions