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

    by  • 11.02.2010 • php, программирование • Комментарии [17]

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

    В этой заметке мы научимся создавать миниатюры с использованием PHP и GD-функций.

    В конце заметки мы сможем создать миниатюры из всех изображений в определенной папке.

    Для создания изображений с помощью PHP нам потребуется GD библиотека, установленная на нашем сервере.

    Для того, чтобы проверить установлена ли нужная нам библиотека, просто посмотрим на вывод функции

    1
    <?phpinfo()?>

    и в цветной таблице показаны все характеристики PHP. нам понадобится лишь раздел GD, если в разделе GD version написано 2.0 or higher, то все в порядке, если же нет, то вам будет необходимо ее установить, чтобы продолжить дальше.

    Теперь немного об алгоритме.

    Для того чтобы создать миниатюры мы проделаем несколько шагов.

    • Пройдемся по папке в поисках JPG и PNG файлов (GD не поддерживает GIF-формат, потому что алгоритм сжатия, применяемый там, находится под защитой авторских прав)
    • Взять каждое изображение и загрузить его
    • Изменить размер
    • Сохранить полученное изображение как миниатюру

    Теперь алгоритм изменения размера:

    • Размер миниатюры будет 100 пикселей, либо по ширине, либо по высоте.
    • Заргужая изображение, мы проверим какое из измерений больше и установим его равным 100 пикселям.
    • Подсчитаем другое измерение

    Главная функция генерации миниатюр

    createThumbnail

    1
    2
    3
    4
    5
    6
    7
    8
    function createThumbnail($name, $filename, $new_w, $new_h) {
       $system = explode('.', $name);
       if (preg_match('/jpg|jpeg/', $system[1]) {
          $src_img = imagecreatefromjpeg($name);
       }
       if (preg_match('/png/', $system[1])) {
          $src_img = imagecreatefrompng($name);
       }

    Для каждого изображения своя функция создания.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $old_x = imageSX($src_img);
    $old_y = imageSY($src_img);
    if ($old_x > $old_y) {
       $thumb_w = $new_w;
       $thumb_h = $old_y * ($new_h / $old_x);
    }
    if ($old_x < $old_y) {
       $thumb_w = $old_x * ($new_w / $old_y);
       $thumb_h = $new_h;
    }
    if ($old_x == $old_y) {
       $thumb_w = $new_w;
       $thumb_h = $new_h;
    }

    Функции imageSX() и imageSY() получают ширину и высоту соответственно. Дальше мы расчитываем ширину и высоту миниатюры, сохраняя правильные пропорции.

    1
    2
    $dst_img = ImageCreateTrueColor($thumb_w, $thumb_h);
    imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y);

    Эти строки создают True Color изображение и копируют исходное с правильными размерами миниатюр.

    1
    2
    3
    4
    5
    6
    7
    8
    if (preg_match("/png/",$system[1])) {
       imagepng($dst_img, $filename);
    }
    else {
       imagejpeg($dst_img, $filename);
    }
    imagedestroy($dst_img);
    imagedestroy($src_img);

    Сейчас мы проверяем расширение изображение, чтобы миниатюры имели тоже самое.

    Как использовать функцию createThumbnail()

    Допустим мы имеем изображение pic.jpg, находящееся в папке images, и хотим создать миниатюру в папке thumbs с именем pic_th.jpg с максимальными измерениями по ширине и высоте в 100 пикселей.

    1
    createThumbnail('images/pic.jpg', 'thumbs/pic_th.jpg', 100, 100);

    Чтобы создать миниатюры из всех изображений, находящихся в определенной папке и расположить их в папке, к примеру thumb c префиксом th_, воспользуемся кодом снизу.

    1
    2
    3
    4
    5
    6
    7
    $pics = directory('pics', 'jpg,JPG,JPEG,jpeg,png,PNG');
    $pics = ditchtn($pics, 'tn_');
    if ($pics[0] != '') {
       foreach ($pics as $pic) {
          createThumbnail('pics/' . $pic, 'thumb/tn_' . $p, 100, 100);
       }
    }

    Теперь мы научились создавать миниатюры на PHP, это может потребоваться для организации какой-нибудь галереи. Например, можно использовать вместе с jQuery. Но не стоит слишком обольщаться, потому как порой функции gd-библиотеки работают слишком медленно. На некоторых серверах может появляться ошибка, связанная с долгим выполнением скрипта. для того, чтобы увеличить это время, подкорректируем параметр max_execution_time = 300 ; в файле php.ini. Похожая заметка о создании миниатюр на PHP.

    Комментарии к "Создание миниатюр GD"

    1. 04.03.2010 at 04:36

      Благодарю ! Статья интересная.

    2. 05.03.2010 at 04:16

      Портал просто супер, побольше бы таких!

    3. 05.03.2010 at 14:19

      Классно всё: и картинка ,и информация

    4. 05.03.2010 at 20:27

      Побольше бы таких тем!

    5. 06.03.2010 at 13:13

      мдяяяя ….. *много думал*…. автору спасибо за пост !!

    6. 06.03.2010 at 20:44

      Хм… Очень даже ничего.

    7. 07.03.2010 at 08:22

      «прочитала с удовольствием»

    8. 07.03.2010 at 15:17

      Шикарно, возьму в дневник

    9. 08.03.2010 at 05:14

      Неплохой пост, очень интересно было посмотреть

    10. 08.03.2010 at 14:45

      Спасибо автору блога за предоставленную информацию.

    11. Halkhog
      23.03.2010 at 02:52

      У меня возник вопрос: что за функция такая
      directory(‘pics’, ‘jpg,JPG,JPEG,jpeg,png,PNG’);
      и
      ditchtn($pics, ‘tn_’);
      Вопрос возник не просто так, сай выдает ошибку:
      Call to undefined function directory() in

    12. 07.09.2010 at 22:27

      if (preg_match(‘/jpg|jpeg/’), $system[1])) {
      $src_img = imagecreatefromjpeg($name);
      }

      Автор, посмотрите внимательно на код. В первом блоке в коде ошибка.

    13. Coder2Two
      25.07.2011 at 14:28

      if (preg_match(‘/jpg|jpeg/’), $system[1])) {
      $src_img = imagecreatefromjpeg($name);
      }
      if (preg_match(‘/jpg|jpeg/’, $system[1]))

      «лишняя» скобка в коде.

    14. 22.09.2011 at 16:57


      Вредный:

      что-то у меня с глазами, но я, хоть убейте, не замечаю

      3 строка: не хватает ) кавычки закрывающей условие if

    15. 04.10.2011 at 16:24

      Ну конечно же
      $system = explode(‘.’, $name);
      Как будто в имени файла может быть только одна точка,
      а если я загружаю файл с названием типа
      45487874.bring.my.money.back.JPG
      делим «по точке»
      и расширение файла получаем *bring, гениально
      Пересмотрите скрипт

    Добавить комментарий

    Ваш e-mail не будет опубликован. Обязательные поля помечены *