Есть простая форма выбора файла:
<form method='post' enctype='multipart/form-data'>
<input name='photo' type='file'>
<input name='photo-submit' type='submit' value='Добавить фото'>
</form>
Форма обрабатывается php-обработчиком, который создаёт миниатюру шириной 200 px:
<?php
$photo_upload_directory = 'photos/'; // путь загрузки полного изображения и его миниатюры
$photo_preview_width = 200; // ширина миниатюры в пикселях
$photo_name = 'photo-'.$_FILES['photo']['name']; // добавление приставки photo- к названию полного изображения
$preview_name = 'preview-'.$_FILES['photo']['name']; // добавление приставки preview- к названию миниатюры
if (isset($_POST['photo-submit'])) {
// запись полного изображения в директорию
move_uploaded_file($_FILES['photo']['tmp_name'], $photo_upload_directory.$photo_name);
// проверка формата файла для создания миниатюры
if(preg_match('/[.](jpg)|(JPG)|(jpeg)|(JPEG)$/', $photo_name)) {$im = imagecreatefromjpeg($photo_upload_directory . $photo_name);}
if (preg_match('/[.](png)|(PNG)$/', $photo_name)) {$im = imagecreatefrompng($photo_upload_directory . $photo_name);}
if (preg_match('/[.](gif)|(GIF)$/', $photo_name)) {$im = imagecreatefromgif($photo_upload_directory . $photo_name);}
// создание миниатюры
$ox = imagesx($im); $oy = imagesy($im); $nx = $photo_preview_width; $ny = floor($oy * ($photo_preview_width / $ox));
$nm = imagecreatetruecolor($nx, $ny);
imagecopyresampled($nm, $im, 0,0,0,0,$nx,$ny,$ox,$oy);
// запись миниатюры в директорию и установка качества изображения
imagejpeg($nm, $photo_upload_directory . $preview_name, 100);
}
?>
Собственно мой вопрос: Как изменить мой обработчик, чтоб миниатюра кадрировалась в размер 200x200px с сохранением пропорций. Я понимаю это так: у полного изображения находится меньшая сторона, потом большая сторона урезается до размера меньшей стороны с выборкой центральной части изображения (или начиная от левого угла), потом полученный квадрат масштабируется в размер 200x200px. Видел много реализаций подобного, но интересует именно компактный вариант кода.