Создание миниатюр GD
by Вредный • 11.02.2010 • php, программирование • Комментарии [17]
В этой заметке мы научимся создавать миниатюры с использованием 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.

Благодарю ! Статья интересная.
Портал просто супер, побольше бы таких!
Классно всё: и картинка ,и информация
Побольше бы таких тем!
мдяяяя ….. *много думал*…. автору спасибо за пост !!
Хм… Очень даже ничего.
«прочитала с удовольствием»
Шикарно, возьму в дневник
Неплохой пост, очень интересно было посмотреть
Спасибо автору блога за предоставленную информацию.
У меня возник вопрос: что за функция такая
directory(‘pics’, ‘jpg,JPG,JPEG,jpeg,png,PNG’);
и
ditchtn($pics, ‘tn_’);
Вопрос возник не просто так, сай выдает ошибку:
Call to undefined function directory() in
if (preg_match(‘/jpg|jpeg/’), $system[1])) {
$src_img = imagecreatefromjpeg($name);
}
Автор, посмотрите внимательно на код. В первом блоке в коде ошибка.
что-то у меня с глазами, но я, хоть убейте, не замечаю
if (preg_match(‘/jpg|jpeg/’), $system[1])) {
$src_img = imagecreatefromjpeg($name);
}
if (preg_match(‘/jpg|jpeg/’, $system[1]))
«лишняя» скобка в коде.
спасибо, вы правы, моя оплошность )
3 строка: не хватает ) кавычки закрывающей условие if
Ну конечно же
$system = explode(‘.’, $name);
Как будто в имени файла может быть только одна точка,
а если я загружаю файл с названием типа
45487874.bring.my.money.back.JPG
делим «по точке»
и расширение файла получаем *bring, гениально
Пересмотрите скрипт