Правильна ли эта логика для изменения размера / обрезки изображений (в php, но речь идет о логике, а не о коде) - PullRequest
0 голосов
/ 01 февраля 2011

Привет всем, у меня есть 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), которые затем могут быть переданы в * 1008. *.

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

Большое спасибо всем!

Dave

1 Ответ

0 голосов
/ 01 февраля 2011

Кажется, работает.Я бы реорганизовал его, инициализируя переменные и извлекая их.Это устраняет необходимость в последнем 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));

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

...