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

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

17 апреля 2010, 23:42

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

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

  • путь к исходному изображению
  • путь к будущей маленькой копии (включая имя файла)
  • ширину копии
  • высоту копии
  • качество для изображений в формате jpeg: 0 - 100, по умолчанию - 75 (подробнее см. руководство функции imagejpeg() на php.net)

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

// пусть файл $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 IMAGETYPE_JPEG: $typestr = 'jpeg'; break;
        case IMAGETYPE_GIF: $typestr = 'gif' ;break;
        case IMAGETYPE_PNG: $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); // чересстрочное формирование изображение
        imagejpeg($destination_resource, $destination_path, $quality);     
    }
    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 IMAGETYPE_JPEG: $typestr = 'jpeg'; break;
        case IMAGETYPE_GIF: $typestr = 'gif' ;break;
        case IMAGETYPE_PNG: $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);
        imagejpeg($destination_resource, $destination_path, $quality);     
    }
    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
Ответить
NO USERPIC

rustrek

Спасибо автору, сделал себе на новостной сайт ресайз + копирайты наложил на фотки супер вот если кто хочет посмотреть как работает в http://newsrbk.ru/news_add.php хух, а то ни как не мог побороть этот ресайз
12.06.2012, 16:27
Ответить

1234ru

Код функции обновлен: вписанные вручную значения типов изображения заменены на константы (IMAGETYPE_JPEG и др.)
То, что не убивает нас, делает нас инвалидами.
26.09.2012, 16:41
Ответить
NO USERPIC

gdv

Подскажите совсем новичку как применить эту функцию к моему случаю. Сейчас и маленькая и большая катинка вводятся по-отдельности.

<tr>
<td valign="top"><b>Логотип маленький</b>: </td>
<td>
<?php
if (strlen($filesmall)>0) {
echo "<img src=\"images/catalog/shina_mod_legk/thumb/$filesmall\" border=\"0\"><br>";
echo "<input type=\"checkbox\" name=\"delimage_s\"> Отметьте, чтобы удалить, или выберите новый<br>";
}
?>
<input type="file" name="filesmall" size="40">
</td>
</tr>
<tr>
<td valign="top"><b>Логотип большой</b>: </td>
<td>
<?php
if (strlen($filebig)>0) {
echo "<img src=\"images/catalog/shina_mod_legk/$filebig\" border=\"0\"><br>";
echo "<input type=\"checkbox\" name=\"delimage_b\"> Отметьте, чтобы удалить, или выберите новый<br>";
}
?>
<input type="file" name="filebig" size="40">
</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="Сохранить"></td>
</tr>

Как сделать так что бы я выбирал только большое изображение, а маленькое делалось автоматически в указанную папку. Много чего перепробовал, но ни одна не работает.
24.11.2013, 19:54
Ответить

1234ru

В том месте, где у вас принимается форма и записываются файлы, большую картинку скопируйте в нужное место на сервере, а потом с помощью image_resize() сделайте из нее маленькую.
То, что не убивает нас, делает нас инвалидами.
25.11.2013, 20:42
Ответить
NO USERPIC

rustrek

спасибо, ещё и к форме добавление в каталог newrbk.ru/firms_add.html прикрутил эту функцию, очень полезная статья
11.01.2014, 16:12
Ответить
NO USERPIC

alexrus

Ребята спасибо, очень помогло, пришлось правда немножко поломать голову, что бы сделать под себя ресайз, но зато теперь всё фурычит как надо кому интересно результат здесь
moskvarbk.ru/novosti/showbiz/alsu-i-soso-pavliashvili-reshili-sostavit-tvorcheskiy-duet.html
с лева картинка загружена через ресайз
15.09.2014, 19:25
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: