Преоразмерете изображението и изрежете до ново съотношение

С помощта на този код качените изображения се намаляват, за да се поберат в зададения максимален размер, като се запазва първоначалното съотношение. Това работи добре.

Сега се стремя също така да изрязва изображението, така че променя съотношението на 4:3 (хоризонтално/вертикално). Също така в рамките на максимален размер от 800px в двете посоки.

Опитах различни кодове/идеи, които можах да намеря в мрежата, но те изглежда изкривяваха изображението, само изрязваха или изобщо не работеха. Как би могло аспектното изрязване да бъде включено в кода, който вече имам?

$max_width = 800;
$max_height = 800;

$image_size_info = getimagesize($image_temp);
$image_width = $image_size_info[0];
$image_height = $image_size_info[1];

$image_res = imagecreatefromjpeg($image_temp);

$image_scale = min($max_width/$image_width, $max_height/$image_height);
$new_width = ceil($image_scale * $image_width);
$new_height = ceil($image_scale * $image_height);

$canvas = imagecreatetruecolor($new_width, $new_height);

imagecopyresampled($canvas, $image_res, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height);

imagejpeg($canvas, 'images/image.jpg', 85);

imagedestroy($image_res);

PS: Моля, въпросът е за ТОЗИ код


person mowgli    schedule 26.07.2015    source източник
comment
можете да опитате cloudinary cloudinary.com api, можете да публикувате снимки и те имат много добър мащаб | аспект и много други добри инструменти   -  person Daniel Krom    schedule 27.07.2015
comment
Благодаря, но не благодаря. Ще се придържам към този изключително прост и локален начин. Вече се приближавам до целта   -  person mowgli    schedule 27.07.2015
comment
да, разбирам, бях твърде мързелив, когато имах същия проблем @mowgli   -  person Daniel Krom    schedule 27.07.2015


Отговори (2)


След много ръчкане това работи.

Той преоразмерява и изрязва, така че изображенията стават 4:3 или 3:4, в зависимост от доминиращата първоначална ширина/височина.

Когато използвате много малки изображения, също трябва да има известна проверка и/или заобикаляне, така че да не се мащабират и т.н.

$max_width = 800;
$max_height = 800;

$image_size_info = getimagesize($image_temp);
$image_width = $image_size_info[0];
$image_height = $image_size_info[1];

$image_res = imagecreatefromjpeg($image_temp);

if ($image_height < $image_width) {

    $cropfactor = $image_height / $image_width;
    $cropfactor = ($cropfactor > 0.75) ? $cropfactor : 0.75;
    $max_height = ceil($max_height * $cropfactor);

} elseif ($image_width < $image_height) {

    $cropfactor = $image_width / $image_height;
    $cropfactor = ($cropfactor > 0.75) ? $cropfactor : 0.75;
    $max_width = ceil($max_width * $cropfactor);

}

$new_width = $image_height * $max_width / $max_height;
$new_height = $image_width * $max_height / $max_width;

$canvas = imagecreatetruecolor($max_width, $max_height);

if ($new_width > $image_width) {

   $cut_x = 0;
   $cut_y = (($image_height - $new_height) / 2);
   $new_width_canvas = $image_width;
   $new_height_canvas = $new_height;

} else {

   $cut_x = (($image_width - $new_width) / 2);
   $cut_y = 0;
   $new_width_canvas = $new_width;
   $new_height_canvas = $image_height;

}

imagecopyresampled($canvas, $image_res, 0, 0, $cut_x, $cut_y, $max_width, $max_height, $new_width_canvas, $new_height_canvas);

imagejpeg($canvas, 'images/image.jpg', 85);

imagedestroy($image_res);
person mowgli    schedule 27.07.2015

Не съм сигурен, независимо дали го изпълнявате на споделен сървър или на някакъв управляван или специален сървър, но imagemagick е наистина чудесен инструмент за всички тези задачи.

person Lund    schedule 26.07.2015
comment
Да, чух за това. Но вече съм толкова близо до целта с това, което имам, че изглежда по-добре просто да се придържам към това. И така, това е въпросът ми - person mowgli; 26.07.2015
comment
Пробвали ли сте вече функцията за изрязване на изображения на PHP (›5.5)? php.net/manual/de/function.imagecrop.php - person Lund; 26.07.2015
comment
Не, но изглежда, че това само изрязва, а не преоразмерява. И съм сигурен, че мога да направя imagecopyresampled, за да го изпълня добре, с правилните изчисления. Вече изрязвам за миниатюра твърде фино. Така че просто се нуждая от правилния алгоритъм/изчисление за аспектното изрязване. О, и сървърът работи с php 5.4 - person mowgli; 26.07.2015