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

Я хочу рассчитать ширину и размер изображения для изменения размера.Я думаю, что может быть три ситуации:

1.Ширина изображения превышает максимальный предел ширины: Затем измените ширину изображения до максимальной ширины и рассчитайте высоту в соответствии с максимальным пределом ширины.Например, ширина изображения - 2248, а высота - 532. Ширина превышает, а высота меньше.Так что уменьшите ширину максимум до 1024 и вычислите высоту, которая будет около 242.

2.Высота изображения превышает предел максимальной высоты: Аналогичным образом измените высоту на максимальную высоту и рассчитайте ширину соответственно.

3.Высота и ширина превышают максимальную высоту и максимальную ширину: Обработайте дальше, выясните, является ли изображение вертикальным или горизонтальным.Если изображение горизонтальное, измените ширину на максимальную и рассчитайте высоту в соответствии с этим.Иначе, если изображение вертикальное или квадратное, измените высоту на максимальную и рассчитайте ширину в соответствии с этим.

Для этих ситуаций, можете ли вы посмотреть мой код ниже, высказать свое мнение об этом эксперту, если онолюбой хороший?Или это можно улучшить?Как?

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

<?
$max_width = 1024;
$max_height = 768;

$img = "t2.jpg";


list($original_width, $original_height) = getimagesize($img);

if (($original_width > $max_width) OR ($original_height > $max_height))
{
//original width exceeds, so reduce the original width to maximum limit.
//calculate the height according to the maximum width.
    if(($original_width > $max_width) AND ($original_height <= $max_height))
    {   
        $percent = $max_width/$original_width;  
        $new_width = $max_width;
        $new_height = round ($original_height * $percent);
    }

    //image height exceeds, recudece the height to maxmimum limit.
    //calculate the width according to the maximum height limit.
    if(($original_width <= $max_width) AND ($original_height > $max_height))
    {
        $percent = $max_height/$original_height;
        $new_height = $max_height;
        $new_width = round ($original_width * $percent);
    }

    //both height and width exceeds.
    //but image can be vertical or horizontal.
    if(($original_width > $max_width) AND ($original_height > $max_height))
    {
        //if image has more width than height
        //resize width to maximum width.
        if ($original_width > $original_height)
        {
            $percent = $max_width/$original_width;
            $new_width = $max_width;
            $new_height = round ($original_height * $percent );
        }

        //image is vertical or square. More height than width.
        //resize height to maximum height.  
        else
        {
        $new_height = $max_height;
        $percent = $max_height/$original_height;
        $new_height = $max_height;
        $new_width = round ($original_width * $percent);
        }
    }
} 
?>

Ответы [ 6 ]

10 голосов
/ 24 октября 2011
// Usage example to find the proper dimensions to resize an image down to 300x400 pixels maximum: 
list($width, $height) = getimagesize($image); 
$new_dimensions = resize_dimensions(100,100,$width,$height);  


// Calculates restricted dimensions with a maximum of $goal_width by $goal_height 
function resize_dimensions($goal_width,$goal_height,$width,$height) { 
    $return = array('width' => $width, 'height' => $height); 

    // If the ratio > goal ratio and the width > goal width resize down to goal width 
    if ($width/$height > $goal_width/$goal_height && $width > $goal_width) { 
        $return['width'] = $goal_width; 
        $return['height'] = $goal_width/$width * $height; 
    } 
    // Otherwise, if the height > goal, resize down to goal height 
    else if ($height > $goal_height) { 
        $return['width'] = $goal_height/$height * $width; 
        $return['height'] = $goal_height; 
    } 

    return $return; 
}
2 голосов
/ 20 сентября 2013

Я считаю, что это более элегантное решение для увеличения или уменьшения, если вы хотите только уменьшить, просто добавьте if ($ scale_percent <1) {} </p>

<?php
$width  = $max_width = 400;
$height = $max_height = 400;
$size = getimagesize($img);
if(count($size)) {
    $width = $size[0];
    $height = $size[1];
    $width_percent = $max_width/$width;
    $height_percent = $max_height/$height;
    $scale = ($width_percent>$height_percent)?'height':'width';
    $scale_percent = $scale.'_percent';
    $scale_percent = $$scale_percent;   
    $width*=$scale_percent;
    $height*=$scale_percent;        
}
?>
2 голосов
/ 26 апреля 2013

Использование тех же имен переменных и оператора if, предотвращающего масштабирование:

<?php
$max_width = 1024;
$max_height = 768;

$img = "t2.jpg";


list($original_width, $original_height) = getimagesize($img);

$ratio = ($max_width / $original_width < $max_height / $original_height
  ? $max_width / $original_width
  : $max_height / $original_width
);
if ($original_width > $max_width || $original_height > $max_height) {
  $new_width = $original_width * $ratio;
  $new_height = $original_height * ratio;
} 
?>
2 голосов
/ 07 июля 2011

Я не знаю PHP, но я бы сделал это следующим образом ( в псевдокоде C ++ ):

float ratio = 1.0;
float ratio_w = max_width/static_cast<float>(original_width);
float ratio_h = max_height/static_cast<float>(original_height);
float ratio_max = std::max(ratio_w, ratio_h);

if (ratio_max < 1.0)
{  
   // width & height are larger than allowed
   // scale to the larger scaling factor
   ratio = ratio_max;
}
else
{
   // pick a scaling factor <= 1.0
   ratio = std::min(ratio, ratio_w);
   ratio = std::min(ratio, ratio_h);
}

if (ratio < 1.0) // this if-clause is not necessary
{
   new_width = original_width * ratio;
   new_height = original_height * ratio;   
}

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

Я не знаю, является ли моя версия более быстрой или более читаемой, чем оригинальная, но по крайней мере избыточность назначений $new_width и $new_height исчезла.

1 голос
/ 07 июля 2011

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

Класс изменения размера изображения

Примечание: вы должны зарегистрироваться на этом сайте, чтобы получить файл

0 голосов
/ 12 декабря 2014

Чтобы получить ширину и высоту изображения Попробуйте это

$image_info = getimagesize($_FILES["file_field_name"]["tmp_name"]);
$image_width = $image_info[0];
$image_height = $image_info[1];
...