Форматировани фото на PHP
И так, на сайте для похудения для прекрасного пола, создаю конструкцию, в которой пользователь может добавить фото ДО участия в проекте и ПОСЛЕ,
Сам процесс записи файла на сервер реализовать не проблема, трудность в том, что проси не проси, участницы фоткаются кто вериткально, кто горизонтально, кто 1:1, а учитывая современное кол-во соотношений сторон фото - задача стает не приятная)
Имея входящий файл-картинку, с произвольной ориентацией и размерами, я бы хотел все приводить к стандартному (в моем понимании() виду.
Работаю процедурно. Осознаю, что скорее всего ужно будет делать при помощи GD!
$file = $_FILES['file'];
Может подскажите ссылкой на видео или ресус, где можно получить ответ на вопрос
ЗЫ Не против даже привести файл вертикальной или горизонтальной ориентации к квадрату, если это упростит задачу)
Ответы (2 шт):
На данном сайте довольно хорошо описаны многие действия с изображениями. От создания картинки, до фильтров на ней. Как вариант изображение можно либо отдалять (imagescale()), либо изменять размер изображения, либо просто обрезать изображение (imagecrop()). В качестве примера привожу код изменения размера изображений с данного сайта
$directory = 'Nature/';
$images = glob($directory."*.jpg");
foreach($images as $image) {
$im_php = imagecreatefromjpeg($image);
$im_php = imagescale($im_php, 640);
$new_height = imagesy($im_php);
$new_name = str_replace('-1920x1080', '-640x'.$new_height, basename($image));
imagejpeg($im_php, $directory.'Resized/'.$new_name);
}
И так решение найдено, вот как сдлал:
ВАЖНО: в итоговом коде я еще провел ряд проверок, (на наличие фала, на тип и на вертикальнсть. Этого требовала конкретно моя задача, тут в примере я опускаю детали и оставляю все самое сочное)
Создаем новое изображение из загржаемого файла:
$im_php = imagecreatefromjpeg($file['tmp_name']);
У нового фото, если он не квадрат, есть большая и меньшая сторона, вычисляем их
$size_max = max(imagesx($im_php), imagesy($im_php));
$size_min = min(imagesx($im_php), imagesy($im_php));
Мне нужен файл в соотношении 16:9, 16 это будет высота, обоначим ее как height
$height = $size_max;
Ширину же получим разделив высоту на 16 и умножим на 9! Таким образом мы обозначим ширину под каждую высоту и в итоге получим правильное соотношение сторон
$width = ($height / 16) * 9;
Если загружаемое фото было 17/9 или 18/9, то программа подставит черный фон, только проблема, что тело фотки при этом будет прижато к левому краю. Нужно вычислить расттояние, на котором тело будет отодвинуто от левого края. Это что то типа padding-left (если говорить на CSS-овском). Дальше немного маги. От ширины изначальной картинки отнимаем то самое 9 из соотношений, и полученый результат делим на пополам, таким образом установив это значение по иксу, тело изображения окажется посредине черного поля!
$x = ($size_min - $width) / 2;
$im_php = imagecrop($im_php, ['x' => $x, 'y' => 0, 'width' => $width, 'height' => $height]);
Длее оставлюбез комментариев, все и так понятно)
$path = '../../img/users_bef_after/';
$new_name = $username.'_'.$field_id.'.jpg';
imagejpeg($im_php, $path.$new_name);
По результатам работы кода, если изначальное фото "ниже", то по бокам обрежутся тонкие полосочки, в результате чего получим файл в 16/9, если фото будет "выше", то по бокам к нему добаявятся черные полосочки)
Это более чем удовлетворяет мой запрос и решение то самое!) Всем спасибо) и спасибо @pashok за наводку)