Расчет размера изображения для изменения размера - PullRequest
42 голосов
/ 06 июля 2011

У меня есть определенные фиксированные ширина и высота, чтобы изменить размер изображения. Однако у меня есть проблема с этим, потому что изображение может иметь любое соотношение размеров (это может быть по вертикали или по горизонтали ). В этом случае фиксированная ширина и высота вызывают проблемы. Я хочу вычислить ширину и высоту более разумным способом.

Например, допустим, я определил ширину 1024px и высоту 768px . И я хочу изменить размер изображения по вертикали (высота 1100px и ширина 200px) . Так что в моем случае он будет изменен до фиксированного размера (1024x768) , поэтому ширина будет увеличена с 100px до 768px , и это будет очень некрасиво. Аналогично, если изображение имеет высоту меньше 768px , оно принудительно увеличит высоту до 768px .

Поэтому я хотел бы рассчитать новый размер изображения на основе исходного размера изображения. Допустим, размер изображения в приведенном выше примере должен быть максимально увеличен до 768px , но как насчет ширины? это уже меньше моей "максимальной ширины", которая составляет 200px , поэтому ширина должна оставаться неизменной? или это должно быть еще больше уменьшено?

Аналогично, если изображение имеет высоту 200px и ширину 1100px . Поэтому ширина должна быть уменьшена до 1024px , но как насчет высоты?

Третья проблема состоит в том, что, давайте предположим, что если высота и ширина больше, чем максимальная высота и максимальная ширина, скажем, ширина: 1100px и высота: 4000px . Теперь, когда ширина и высота больше максимальной ширины и максимальной высоты, но изображение вертикальное, оно будет горизонтальным. Так как же я могу проверить, нужно ли в этом случае изменять размер изображения в соответствии с максимальной высотой или максимальной шириной?

Я ценю любую помощь с этим.

Ответы [ 12 ]

0 голосов
/ 30 августа 2014

Я дошел до этого вопроса и не нашел подходящего ответа, поэтому я сам решил ответить на вопрос.

Я начал с некоторой базовой логики, и после консультации с моим другом, которыйнемного лучше в математике, это то, что мы придумали.

function calculate_dimensions($width,$height,$max){
    if($width != $height){
        if($width > $height){
            $t_height = $max;
            $t_width = min(($width * $t_height)/$height);
        }
        if($height > $width){
            $t_width = $max;
            $t_height = min(($t_width * $height)/$width)
        }
    }else{
        if($width > $max){
            $t_width = $t_height = $max;
        }
    }
    $res = ['height'=>$t_height,'width'=>$t_width]
    return $res;
}

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

благодарность моему другу, Джастину Джиллетту за блестящее предложение перекрестного умножения.

0 голосов
/ 06 июля 2011

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

if(($w - $w_max) > ($h - $h_max)) {
    $w_new = $w_max;
    $h_new = (int) ($h * ($w_max / $w));
}
else {
    $h_new = $h_max;
    $w_new = (int) ($w * ($h_max / $h));
}
...