webew
Войти » Регистрация
 
PHP

Функция PHP для создания уменьшенной копии изображения (resize)

17 апреля 2010, 23:42
Автор: Михаил Серов [1234ru]

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

Функция работает с изображениями формата GIF, JPEG и PNG (при желании можно расширить этот список, насколько это позволяет библиотека GD, на основе которой построена работа предлагаемой функции). В качестве входных аргументов она принимает:

При желании высоту можно не передавать — функция сама рассчитает её и сделает изображение тех же пропорций, что и исходное. Если передать нулевую ширину — также будет сделано изображение тех же пропорций, но уже на основании высоты:

// пусть файл $imgpath - изображение 800х600
image_resize($imgpath, $preview, 100); // будет создано изображение $preview 100х75
image_resize($imgpath, $preview, 0, 100); // а так $preview получится 133х100

Если пропорции переданных ширины и высоты отличаются от исходных, новое изображение окажется искажено, поэтому лучше использовать один из вышеперечисленных вариантов.

Также нужно озаботиться тем, чтобы исходный файл уже существовал (при обращении к несуществующему файлу функция сгенерирует warning), и чтобы у веб-сервера имелись права на запись в то место, куда хочется поместить уменьшенную копию (иначе также будет warning).

Для jpeg-изображений функция выполняет чересстрочное формирование, благодаря чему изображение создаётся в формате progressive JPEG и начинает отображаться в браузере до окончания полной загрузки с постепенным увеличением качества (подробнее см., например, на php.net).

Ниже приводится непосредственно код функции.

function image_resize(
    $source_path,
    $destination_path,
    $newwidth,
    $newheight = FALSE,
    $quality = FALSE // качество для формата jpeg
    ) {

    ini_set("gd.jpeg_ignore_warning", 1); // иначе на некотоых jpeg-файлах не работает
   
    list($oldwidth, $oldheight, $type) = getimagesize($source_path);
   
    switch ($type) {
        case 1: $typestr = 'gif' ;break;
        case 2: $typestr = 'jpeg'; break;
        case 3: $typestr = 'png'; break;
    }
    $function = "imagecreatefrom$typestr";
    $src_resource = $function($source_path);
   
    if (!$newheight) { $newheight = round($newwidth * $oldheight/$oldwidth); }
    elseif (!$newwidth) { $newwidth = round($newheight * $oldwidth/$oldheight); }
    $destination_resource = imagecreatetruecolor($newwidth,$newheight);
   
    imagecopyresampled($destination_resource, $src_resource, 0, 0, 0, 0, $newwidth, $newheight, $oldwidth, $oldheight);
   
    if ($type = 2) { # jpeg
        imageinterlace($destination_resource, 1); // чересстрочное формирование изображение
        if ($quality) imagejpeg($destination_resource, $destination_path, $quality);
        else imagejpeg($destination_resource, $destination_path);
    }
    else { # gif, png
        $function = "image$typestr";
        $function($destination_resource, $destination_path);
    }
   
    imagedestroy($destination_resource);
    imagedestroy($src_resource);
}

© Все права на данную статью принадлежат порталу webew.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.
Добавить комментарий
Отображение комментариев: Древовидное | Плоское

1234ru

В первоначальный вариант функции внесены следующие изменения:

1. imagecopyresized() заменена на imagecopyresampled(), поскольку последняя лучше подходит для создания уменьшенных вариантов изображений.

2. jpeg-Изображения создаются в чересстрочном режиме (формат progressive JPEG) с помощью функции imageinterlace().

3. Для jpeg-изображений добавлен параметр $quality (см. описание функции imagejpeg()).
То, что не убивает нас, делает нас инвалидами.
31.05.2010, 14:39
Ответить

1234ru

А вот вариант функции, который способен ресайзить анимированные gif'ы (используется библиотека ImageMagick):

function image_resize( # http://webew.ru/articles/2868.webew
    $source_path,
    $destination_path,
    $newwidth,
    $newheight = FALSE,
    $quality = FALSE // качество для формата jpeg
    ) {

    ini_set("gd.jpeg_ignore_warning", 1); // иначе на некотоых jpeg-файлах не работает
   
    list($oldwidth, $oldheight, $type) = getimagesize($source_path);
   
    switch ($type) {
        case 1: $typestr = 'gif' ;break;
        case 2: $typestr = 'jpeg'; break;
        case 3: $typestr = 'png'; break;
    }
   
    // анимация
    if($type == 1){
        $images = new Imagick($source_path);
        if($images->getNumberImages() > 1){
            $images = $images->coalesceImages();
            $oldwidth  = $images->getImageWidth();
            $oldheight = $images->getImageHeight();
           
            if (!$newheight) { $newheight = round($newwidth * $oldheight/$oldwidth); }
            elseif (!$newwidth) { $newwidth = round($newheight * $oldwidth/$oldheight); }
           
            do {
                $images->scaleImage($newwidth, $newheight);
            } while ($images->nextImage());
            $images = $images->deconstructImages();
            $images->writeImages($destination_path, true);
           
            return;
        }
    }
   
    $function = "imagecreatefrom$typestr";
    $src_resource = $function($source_path);
   
    if (!$newheight) { $newheight = round($newwidth * $oldheight/$oldwidth); }
    elseif (!$newwidth) { $newwidth = round($newheight * $oldwidth/$oldheight); }
    $destination_resource = imagecreatetruecolor($newwidth,$newheight);
   
    imagecopyresampled($destination_resource, $src_resource, 0, 0, 0, 0, $newwidth, $newheight, $oldwidth, $oldheight);
   
    imagegammacorrect($destination_resource, 1, 1.1);
   
    if ($type == 2) { # jpeg
        imageinterlace($destination_resource, 1);
        if ($quality) imagejpeg($destination_resource, $destination_path, $quality);
        else imagejpeg($destination_resource, $destination_path);
    }
    else { # gif, png
        $function = "image$typestr";
        $function($destination_resource, $destination_path);
    }
   
    imagedestroy($destination_resource);
    imagedestroy($src_resource);
}
То, что не убивает нас, делает нас инвалидами.
09.09.2010, 16:49
Ответить

1234ru

Добавлено
ini_set("gd.jpeg_ignore_warning", 1);

Без этого функция imagecreatefromjpeg() работает с некоторыми файлами в формате jpeg некорректно (подробнее см. руководство по PHP и о gd-jpeg, libjpeg: recoverable error)
То, что не убивает нас, делает нас инвалидами.
24.01.2011, 15:53
Ответить
NO USERPIC

fiamma

А мне очень понравился метод ресайза изображений, предложенный на сайте Takein.ru
Вот ссылка: ресайз изображений средствами php
08.05.2011, 03:39
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2007—2012 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100