• принимает картинку (через форму или из CLI),
• создаёт три версии ‒ small, medium, large,
• сохраняет их в папку output,
• корректно работает c JPG/PNG/GIF и сохраняет прозрачность PNG/GIF.
Файл назовём resize.php.
```php
<?php
/* ---------------------------------------------------------
Конфигурация: имена вариантов и их максимальная ширина
--------------------------------------------------------- */
$sizes = [
'small' => 150, // эскиз
'medium' => 300, // превью
'large' => 600 // изображение в тексте
];
/* ---------------------------------------------------------
ФОРМА загрузки (показываем только при открытии в браузере)
--------------------------------------------------------- */
if (php_sapi_name() !== 'cli' && empty($_FILES)) {
?>
<!doctype html>
<html lang="ru">
<head><meta charset="utf-8"><title>Загрузка изображения</title></head>
<body>
<h2>Загрузите изображение</h2>
<form method="post" enctype="multipart/form-data">
<input type="file" name="pic">
<button type="submit">Отправить</button>
</form>
</body>
</html>
<?php
exit;
}
/* ---------------------------------------------------------
Определяем путь к исходнику (CLI или из формы)
--------------------------------------------------------- */
$srcPath = $_FILES['pic']['tmp_name'] ?? $argv[1] ?? null;
if (!$srcPath || !file_exists($srcPath)) {
die("Не передан файл. В браузере воспользуйтесь формой, в консоли:\nphp resize.php /path/to/file.jpg\n");
}
$origName = pathinfo($_FILES['pic']['name'] ?? $srcPath, PATHINFO_FILENAME);
$ext = strtolower(pathinfo($_FILES['pic']['name'] ?? $srcPath, PATHINFO_EXTENSION));
/* ---------------------------------------------------------
Готовим директорию для результата
--------------------------------------------------------- */
$outDir = __DIR__ . '/output';
if (!is_dir($outDir)) mkdir($outDir, 0777, true);
/* ---------------------------------------------------------
Основная функция ресайза
--------------------------------------------------------- */
function resizeImage(string $src, string $dst, int $newW): void
{
[$w, $h, $type] = getimagesize($src);
$ratio = $h / $w;
$newH = (int)round($newW * $ratio);
/* Исходное изображение */
switch ($type) {
case IMAGETYPE_JPEG: $srcIm = imagecreatefromjpeg($src); break;
case IMAGETYPE_PNG: $srcIm = imagecreatefrompng ($src); break;
case IMAGETYPE_GIF: $srcIm = imagecreatefromgif ($src); break;
default: throw new RuntimeException('Неподдерживаемый тип');
}
/* Холст под результат */
$dstIm = imagecreatetruecolor($newW, $newH);
/* Прозрачность для PNG/GIF */
if (in_array($type, [IMAGETYPE_PNG, IMAGETYPE_GIF])) {
imagecolortransparent($dstIm, imagecolorallocatealpha($dstIm, 0, 0, 0, 127));
imagealphablending($dstIm, false);
imagesavealpha($dstIm, true);
}
/* Непосредственно масштабирование */
imagecopyresampled($dstIm, $srcIm, 0, 0, 0, 0, $newW, $newH, $w, $h);
/* Сохранение результата */
switch ($type) {
case IMAGETYPE_JPEG: imagejpeg($dstIm, $dst, 90); break;
case IMAGETYPE_PNG: imagepng ($dstIm, $dst, 8); break;
case IMAGETYPE_GIF: imagegif ($dstIm, $dst); break;
}
imagedestroy($srcIm);
imagedestroy($dstIm);
}
/* ---------------------------------------------------------
Запускаем ресайз для всех размеров
--------------------------------------------------------- */
foreach ($sizes as $label => $width) {
$dest = "{$outDir}/{$origName}_{$label}.{$ext}";
resizeImage($srcPath, $dest, $width);
echo "Создано: $dest\n";
}
/* ---------------------------------------------------------
Если работаем из браузера – даём ссылки на файлы
--------------------------------------------------------- */
if (php_sapi_name() !== 'cli') {
echo '<hr><h3>Результаты</h3><ul>';
foreach ($sizes as $label => $_) {
$fname = "{$origName}_{$label}.{$ext}";
echo "<li><a href='output/$fname' target='_blank'>$fname</a></li>";
}
echo '</ul>';
}
```
Как это работает
1. Секция «Конфигурация» задаёт желаемые ширины.
Высота вычисляется автоматически, чтобы сохранить пропорции.
2. При обращении из браузера выводится простая форма для загрузки файла.
3. Скрипт определяет тип картинки через getimagesize() и создает ресурс-изображение нужной функции (imagecreatefromjpeg/png/gif).
4. Создаётся холст imagecreatetruecolor() требуемого размера, затем с помощью imagecopyresampled() изображение аккуратно масштабируется (лучшее качество).
5. Для PNG/GIF дополнительно включена поддержка прозрачности.
6. Результаты кладутся в /output с суффиксами _small, _medium, _large.
7. В CLI-режиме скрипт выводит список путей в консоль, в браузере – формирует ссылки на файлы.
Требования
• PHP c включённым расширением GD (обычно уже есть в стандартной сборке).
• Права на запись в каталог output.
При желании можно:
– изменить массив $sizes, добавив любые размеры;
– вместо GD использовать Imagick (если он установлен), изменив лишь функцию resizeImage().