【问题标题】:Calculating new image size - how can I make this more efficient/shorter计算新的图像大小 - 我怎样才能使它更有效/更短
【发布时间】:2012-08-16 10:53:20
【问题描述】:

我有一个脚本,它对于一个实际简单的任务来说非常庞大,因为它经常嵌套。它的作用是这样的:

  • 获取图像的当前大小
  • 获取新的最大尺寸
  • 计算图像要调整到的尺寸(始终保持纵横比):
    • 如果图像小于新尺寸:保持原始尺寸
    • 如果最大新维度具有 x 和 y 值:缩放图像以适应这两个值
    • 如果最大新维度只有一个 x 值:缩放以适应至少 x
    • 如果最大新维度只有一个 y 值:缩放以适应至少 y

这是脚本:

//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]);
}

它做了它应该做的。但是有没有更简单的方法来做到这一点?我想我看这段代码太频繁了,找不到优化的方法。

【问题讨论】:

  • 只是对代码可读性的注释,将您的数组元素命名为$dimensions = array(x = 1920, y = 1200); 将让您稍后参考x & y。
  • 好主意。比 0|1 更容易维护 - 我可以看到。

标签: php image-resizing dimensions


【解决方案1】:

您应该在尺寸的口粮上使用“min”来计算所需的比例。如果是 >1 则不需要缩小,如果

//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
}

【讨论】:

  • 0 won't work, but it's your example ;) - 为什么不呢?当指定y 不受限制时,他应该改用什么?除非旧维度中包含零,否则您最终不会被零除 - 这显然是不可能的。
  • min 函数在这里非常时尚。因此,当两者都给定时,这将使图像始终适合新的维度。它不适用于其他情况,对吗?在示例 (160,0) 中,图像将被缩放以适应 160px 的宽度,并且根据纵横比计算高度。
  • 我将其读作“最大 X 尺寸为 160,最大 Y 尺寸为 0”,这就是为什么我说它不起作用 - 因为最小值排除了这一点。如果您想允许 0 作为“允许任何事情”,那么您将需要一些“诡计多端的扑克”或简单地设置为 999999,这基本上将其排除在等式之外。
  • @DaveRandom - 见上面的评论(给 OP)。 0 将导致 0 成为我的解决方案的结果大小 - 为什么我说它不起作用。但是将其设置为一个极端的上限,例如 999999 将有效地将其排除在等式之外。
  • @Robbie 哦,是的,很明显现在你指出来了。我想我需要更多的茶。 +1
猜你喜欢
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 2020-04-01
  • 2011-07-10
  • 2016-08-10
  • 2019-11-10
相关资源
最近更新 更多