php - алгоритм уменьшения размеров изображения - PullRequest
1 голос
/ 09 мая 2011

У меня есть скрипт php, в котором я хочу отображать некоторые изображения внутри div, но есть некоторые ограничения, касающиеся максимальной ширины и высоты.
Например, изображение может иметь ширину = 1000px и высоту = 600px, номаксимальная ширина и высота изображения не должны превышать 500 пикселей, чтобы поместиться в div.
Итак, я хочу преобразовать размеры так, чтобы изображение помещалось в div, но соотношение между шириной и высотой оставалосьтак же.

Пример: размеры изображения: 1000x600, max-width = 500, max-height = 400. Результат измерения должен быть не 500x400, а 500x300.

Я написал кусоккода, который, кажется, работает, но он не работает должным образом с точки зрения производительности при большом количестве изображений, так как он делает что-то вроде пошагового уменьшения размера на 10%, пока результат не будет достигнутпринятый лимит.

Есть идеи?Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 09 мая 2011

Это масштабирует ваши значения максимум в 2 раза.

<?php
define('MAX_WIDTH', 500);
define('MAX_HEIGHT', 200);

function scale($w, $h)
{
   $rw = $w; $rh = $h; $factor = 0.0;

   if( $rw > MAX_WIDTH )
   {
        $factor = $rw / MAX_WIDTH;
        $rw = MAX_WIDTH;
        $rh = floor($factor * $rh);
   }
   if( $rh > MAX_HEIGHT )
   {
        $factor = $rh / MAX_HEIGHT;
        $rh = MAX_HEIGHT;
        $rw = floor($factor * $rw);
   }

   return array($rw, $rh);
}
echo explode('x', scale(1000, 500));
?>
2 голосов
/ 09 мая 2011

Не будет хорошей идеей динамически изменять размер ваших изображений при каждом доступе пользователя к вашей странице.

В зависимости от сценария, который вы используете, , как этот , вам нужно будет сначала изменить размер всех ваших изображений и сохранить их, чтобы не было накладных расходов каждый раз, когда кто-то обращается к вашемустр.

Покажите часть кода, который у вас есть, возможно, его можно улучшить

1 голос
/ 09 мая 2011

Не совсем понятно, о чем вы спрашиваете.

1) Сколько происходит масштабирование? Если это не так уж и много, лучше оставить CSS.

2) Я полагаю, вы используете GD или ImageMagick или что-то еще? Возможно, вы ищете что-то вроде этого:

function scale($x,$y,$maxX, $maxY) {
    if ($x > $maxX) return array($maxX, $maxX / $x * $y);
    else return array($x, $y);
}
...
<declare variables $toScaleX, $toScaleY, $maxX, $maxY>
list($x, $y) = scale($toScaleX, $toScaleY, $maxX, $maxY);
list($x, $y) = scale($y, $x, $maxY, $maxX);
<$x, $y, are now the desired dimensions to scale to>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...