Вы хотите создать эскиз на PHP, или обрезать изображение с помощью PHP, а так же уменьшить размер изображеия. Этот простой класс для вас.

Суть

Эскиз создается единажды для указанного размера и пути файла. Передаем в метод класса относительный путь к файлу, желаемые размеры эскиза, и режим обработки. Режим 1 создаст эскиз вписанный в область исходного изображения. Прелесть данного варианта в том, что изображения лежат в кеше и могут быть отданы nginx-ом без участия PHP.

Непосредственно класс:


<?php
class preview {
    const QUALITY = 95; // Качество эскиза

    private $cache_dir; // Путь до каталога кэша эскизов
    private $file_path; // Путь к файлу
    public $errors;

    function __construct($file_path = null) {
        $this->errors = array();

        if (file_exists($file_path))
            $this->file_path = $file_path;
        else {
            $this->errors[] = 'Файл ' . $file_path . ' не найден на жестком диске';
            return false;
        }
        $this->cache_dir = $_SERVER['DOCUMENT_ROOT'] . '/cache_previews';
        if (!is_writable($this->cache_dir))
            die('Невозможно записать в ' . $this->cache_dir);
    }

    public function get($width = 150, $height = 150, $mode = null) {

        if (gettype($width) != 'integer' || gettype($height) != 'integer') {
            $this->errors[] = 'Неверные параметры максимальной ширины или/и высоты';
            return false;
        }

        $PrevFileName = md5($this->file_path . $width . $height . $mode) . '.jpg';

        if (file_exists($this->cache_dir . '/' . $PrevFileName)) {
            return $PrevFileName;
        }

        // Получаем размеры сторон исходного изображения
        $size = getimagesize($this->file_path);

        // $size[0] ширина
        // $size[1] высота
        // Если эскиз-квадрат, вписываем его в область исходного изображения

        switch ($mode) {

            case 1 :
                // Режим вписывания квадратного эскиза
                // Расчитываем центр изображения, получаем координаты квадратной
                // области в центре исходного изображения
                if ($size[0] > $size[1]) {
                    /* ---- Если изображение горизонтальное ----- */
                    $x_e = ceil(($size[0] - $size[1]) / 2);
                    $y_e = 0;
                    $mx = $size[1];
                    $my = $size[1];
                    $or = 'Гор';
                } else {
                    /* ---- Если изображение вертикальное ----- */
                    $x_e = 0;
                    $y_e = ceil(($size[1] - $size[0]) / 2);
                    $mx = $size[0];
                    $my = $size[0];
                    $or = 'Верт';
                }
                break;



            default :
                // full режим
                // Если исходное изображение меньше требуемого эскиза, 
                // копируем оригинал в кэш эскизов и отдаем имя файла
                if ($size[0] <= $width && $size[1] <= $height){
                    copy($this->file_path, $this->cache_dir.'/'.$PrevFileName);
                    return $PrevFileName;
                }
                
                $x_e = 0;
                $y_e = 0;
                $mx = $size[0];
                $my = $size[1];

                $KofOrig = ($size[0] > $size[1]) ? ($size[0] / $size[1]) : ($size[1] / $size[0]);

                if ($size[0] > $size[1]) {
                    // гор
                    $new_w = $KofOrig * $height;
                    if ($new_w > $width) {
                        $new_w = $width;
                        $height = ceil($width / $KofOrig);
                    }
                    $width = ceil($new_w);
                } else {
                    $new_h = $KofOrig * $width;
                    if ($new_h > $height) {
                        $new_h = $height;
                        $width = ceil($height * $KofOrig);
                    }
                    $height = ceil($new_h);
                }

                break;
        }


        // процесс ресайза, кропа и т.д...
        $image_p = imagecreatetruecolor($width, $height);
        $image = imagecreatefromjpeg($this->file_path);
        imagecopyresampled(
                $image_p, // Ресурс нового изображения
                $image, // Ресурс исходного изображения
                0, 0, // Координаты (x,y) верхнего левого угла области в новом изображении
                $x_e, $y_e, // Координаты (x,y) верхнего левого угла области копируемого исходного изображения
                $width, // Ширина копируемой области
                $height, // Высота копируемой области
                $mx, // Ширина исходной копируемой области
                $my          // Высота исходной копируемой области
        );


        // Сохранение в файл
        imagejpeg($image_p, $this->cache_dir.'/'. $PrevFileName, self::QUALITY);
        imagedestroy($image_p);
        imagedestroy($image);
        return $PrevFileName;
    }
}

Для использования класса, его необходимо подключить. Создать каталог кэша с правами записи для веб сервера. Настроить путь к кэшу в конструкторе класса. Затем создаем новый экземпляр объекта класса, при этом передав параметром абсолютный путь к файлу изображения.

<?php
$preview = new preview($_SERVER['DOCUMENT_ROOT'].'/images/1.jpg');
?>

Теперь из этого объекта методом get мы можем вытягивать различные эскизы. Метод get возвращает короткое имя файла эскиза. По умолчанию эскиз будет со сторонами не превышающими 150 пикселей по большей стороне. Вообще, метод работает таким образом, что рамер стороны эскиза не превысит размер, указанный в параметре для соответствующей стороны. Т.е. если использовать $preview->get(200,500), то ширина эскиза не привысит 200 пикселей, а высота не превысит 500 px.

<img src="/cache_previews/<?php echo $preview->get(); ?>">

Так же возможно вырезать центр изображения в виде квадратной области. Для этого передается третий параметр, который управляет режимом создания эскиза. Режим «1». В дальнейшем я буду развивать этот клас новыми возможностями и режимами.

<img src="/cache_previews/<?php echo $preview->get(200,200,1); ?>">

Примеры использования:

<?php
// подключаем класс для создания эскизов
include './classes/preview.php';
?>
<!--Выводим исходное изображение-->
<img src="/images/1.jpg" style="float:left;">

<?php
// Создаем экземпляр класса. При этом указываем абсолютный путь к файлу изображения
$preview = new preview($_SERVER['DOCUMENT_ROOT'].'/images/1.jpg');
?>
<img src="/cache_previews/<?php echo $preview->get(); ?>" style="float:left;">
<img src="/cache_previews/<?php echo $preview->get(200,200,1); ?>" style="float:left;">
<img src="/cache_previews/<?php echo $preview->get(300,300); ?>" style="float:left;">
<img src="/cache_previews/<?php echo $preview->get(100,100,1); ?>" style="float:left;">

Результат работы PHP класса для создания эскизов:

<a href="/uploads/img/42/example.jpg" class="fancybox">
<img alt="Эскизы созданные с помощью PHP" src="/uploads/img/42/example_x200.jpg">
</a>