Создание миниатюры

1-ый способ: PHP 5.5

В PHP 5.5 появилась функция imagescale(), которая изменяет размеры картинки. До этого приходилось вручную узнавать размеры картинки для миниатюры (указано во втором примере).

function image_create($image_path) {

    $ext = pathinfo($image_path, PATHINFO_EXTENSION);
    switch($ext) {
        case 'gif':
            $im = imagecreatefromgif($image_path);
            break;
        case 'jpg':
        case 'jpeg':
            $im = imagecreatefromjpeg($image_path);
            break;
        case 'png':
            $im = imagecreatefrompng($image_path);
            break;
        case 'webp':
            $im = imagecreatefromwebp($image_path);
            break;
        default:
            throw new Exception('Неверный формат файла');
    }

    unset($ext);
    return $im;
}

function thumb($image_source, $save_as, $width) {
    
    // Проверка на наличие изображений
    if (!file_exists($image_source)) { throw new Exception('Изображение '.$image_source.' не найдено'); }
    
    $image = image_create($image_source);
    $thumb = imagescale($image, $width);
    
    // сохранение прозрачности (для PNG и GIF)
    imagealphablending($thumb, false);
    imagesavealpha($thumb, true);
    
    // сохранение картинки
    imagepng($thumb, $save_as);
    
    // освобождение памяти
    imagedestroy($image);
    imagedestroy($thumb);
}


// создание миниатюры шириной в 200 пикселей
thumb('image.png', 'thumbname.png', 200);

2-ой способ: до PHP 5.5

Миниатюра создаётся через функцию imagecopyresampled(), которая уменьшает картинку до указанных размеров.

function image_create($image_path) {

    $ext = pathinfo($image_path, PATHINFO_EXTENSION);
    switch($ext) {
        case 'gif':
            $im = imagecreatefromgif($image_path);
            break;
        case 'jpg':
        case 'jpeg':
            $im = imagecreatefromjpeg($image_path);
            break;
        case 'png':
            $im = imagecreatefrompng($image_path);
            break;
        case 'webp':
            $im = imagecreatefromwebp($image_path);
            break;
        default:
            throw new Exception('Неверный формат файла');
    }

    unset($ext);
    return $im;
}

function thumb($image_source, $save_as, $width) {
    
    // Проверка на наличие изображений
    if (!file_exists($image_source)) { throw new Exception('Изображение '.$image_source.' не найдено'); }

    $image = image_create($image_source);
    list($im_size['width'], $im_size['height']) = getimagesize($image_source);
    $thumb_size['width'] = $width;
    $thumb_size['height'] = floor($im_size['height'] * ($thumb_size['width'] / $im_size['width']));
    $thumb = imagecreatetruecolor($thumb_size['width'], $thumb_size['height']);

    // сохранение прозрачности (для PNG и GIF)
    imagealphablending($thumb, false);
    imagesavealpha($thumb, true);

    // создание миниатюры
    imagecopyresampled($thumb, $image, 0, 0, 0, 0, $thumb_size['width'], $thumb_size['height'], $im_size['width'], $im_size['height']);

    // сохранение картинки
    imagepng($thumb, $save_as);
    
    // освобождение памяти
    imagedestroy($image);
    imagedestroy($thumb);
}


// создание миниатюры шириной в 200 пикселей
thumb('image.png', 'thumbname.png', 200);

Также есть функция imagecopyresized(), которая работает также, как и imagecopyresampled(), только сохраняет картинки немного в худшем качестве.