Правильна ли эта логика для изменения размера/обрезки изображений (в php, но речь идет о логике, а не о коде)

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

$sourceratio = $actualsourcewidth / $actualsourceheight;
$targetratio = $targetwidth / $targetheight;

if ($targetratio < $sourceratio)
{
    $srcheight = $actualsourceheight;
    $srcwidth = $actualsourceheight * $targetratio;
    $srcy = 0;
    $srcx = floor(($actualsourcewidth - $srcwidth) / 2);
    $srcwidth = floor($srcwidth);
} else if ($targetratio > $sourceratio)
{
    $srcwidth = $actualsourcewidth;
    $srcheight = $actualsourcewidth / $targetratio;
    $srcy = floor(($actualsourceheight - $srcheight) / 2);
    $srcx = 0;
    $srcheight = floor($srcheight);
} else
{
// Same aspect ratio so you can resize the image without cropping
    $srcheight = $actualsourceheight;
    $srcwidth = $actualsourcewidth;
    $srcx = 0;
    $srcy = 0;
}

Из того, что я могу понять, это должно уловить все возможности и создать начальные координаты x, y ($srcx и $srcy) и исходные размеры ($srcwidth, $srcheight), которые затем можно передать в imagecopyresampled.

Главное, что я хотел проверить, это то, что проверка соотношения не позволит $srcheight и $srcwidth когда-либо быть больше исходной ширины/высоты, так как это сломает его, но я не думаю, что это произойдет?

Большое спасибо как никогда всем!

Дэйв


person deshg    schedule 01.02.2011    source источник


Ответы (1)


Кажется, это работает. Я бы реорганизовал его, инициализируя переменные и извлекая их. Это устраняет необходимость в последнем блоке else и делает код более понятным для чтения.

$sourceratio = $actualsourcewidth / $actualsourceheight;
$targetratio = $targetwidth / $targetheight;
$srcx = 0;
$srcy = 0;
$srcheight = $actualsourceheight;
$srcwidth = $actualsourcewidth;

if ($targetratio < $sourceratio)
{
    $srcwidth = $actualsourceheight * $targetratio;
    $srcx = floor(($actualsourcewidth - $srcwidth) / 2);
    $srcwidth = floor($srcwidth);
} else if ($targetratio > $sourceratio)
{
    $srcheight = $actualsourcewidth / $targetratio;
    $srcy = floor(($actualsourceheight - $srcheight) / 2);
    $srcheight = floor($srcheight);
}

Если вы хотите быть абсолютно уверены, что $srcwidth и $srcheight не превышают оригиналы, вы всегда можете зафиксировать их значения.

$srcheight = min($actualsourceheight, floor($srcheight));

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

person brian_d    schedule 01.02.2011
comment
Спасибо за ваш ответ, и я согласен с инициализацией переменных. Я проверил его с несколькими вариантами, и он всегда возвращается в порядке, однако я действительно просто хотел проверить математически, что я прав, думая, что они никогда не будут превышены, независимо от ширины/высоты? - person deshg; 15.02.2011