Все ленты — последние статьи

Динамическое создание миниатюр изображений с помощью PHP

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


Код

Мы будем использовать PHP для динамического создания миниатюр изображений. В скрипте будут обрабатываться изображения основных форматов: png, jpg, gif.

Укажем нужный размер миниатюры.
1 $nw = 150; // Ширина миниатюр
2 $nh = 100; // Высота миниатюр

 

Теперь укажем скрипту исходный файл и файл с результатом работы.
1 $source = "images/test/test.jpg"; // Исходный файл
2 $dest = "images/test/thumb/test.jpg"; // Файл с результатом работы

Следующая часть кода будет автоматически отделять расширение файла. Мы используем функцию PHP explode для разделения имени файла на части между точками, а затем используем функцию count для определения последней части исходной строки, которая является расширением файла.
1 $stype = explode(".", $source);
2 $stype = $stype[count($stype)-1];

Затем получаем размер оригинального изображения.
1 $size = getimagesize($source);
2 $w = $size[0]; // Ширина изображения
3 $h = $size[1]; // Высота изображения

Затем используем нужную функцию PHP для работы с определенным форматом изображения:
01 switch($stype) {
02 case 'gif':
03 $simg = imagecreatefromgif($source);
04 break;
05 case 'jpg':
06 $simg = imagecreatefromjpeg($source);
07 break;
08 case 'png':
09 $simg = imagecreatefrompng($source);
10 break;
11 }

И, наконец, создаем миниатюру и помещаем ее в указанную папку.
01 $dimg = imagecreatetruecolor($nw, $nh);
02 $wm = $w/$nw;
03 $hm = $h/$nh;
04 $h_height = $nh/2;
05 $w_height = $nw/2;
06
07 if($w > $h) {
08 $adjusted_width = $w / $hm;
09 $half_width = $adjusted_width / 2;
10 $int_width = $half_width — $w_height;
11 imagecopyresampled($dimg,$simg,-$int_width,0,0,0,$adjusted_width,$nh,$w,$h);
12 } elseif(($w < $h) ($w == $h)) {
13 $adjusted_height = $h / $wm;
14 $half_height = $adjusted_height / 2;
15 $int_height = $half_height — $h_height;
16 imagecopyresampled($dimg,$simg,0,-$int_height,0,0,$nw,$adjusted_height,$w,$h);
17 } else {
18 imagecopyresampled($dimg,$simg,0,0,0,0,$nw,$nh,$w,$h);
19 }
20 imagejpeg($dimg,$dest,100);

В результате выполнения скрипта мы получим готовую миниатюру в указанном файле.


Вариант скрипта

Представленный ниже скрипт находит все изображения в указанной папке и создает миниатюры для них, помещая в нужный каталог.
01 $thumb_directory = "images/thumb"; //Папка для миниатюр
02 $orig_directory = "images/full"; //Папка для полноразмерных изображений
03
04 $dir_handle = @opendir($orig_directory); //Открываем папку с полноразмерными изображениями
05 if ($dir_handle > 1){ //Проверяем, что папка открыта и в ней есть файлы
06
07 $allowed_types=array('jpg','jpeg','gif','png'); // Список обрабатываемых расширений
08 $file_parts=array();
09 $ext='';
10 $title='';
11 $i=0;
12
13 while ($file = @readdir($dir_handle))
14 {
15 /* Пропускаем системные файлы: */
16 if($file=='.' $file == '..') continue;
17
18 $file_parts = explode('.',$file); //Разделяем имя файла на части
19 $ext = strtolower(array_pop($file_parts));
20
21 /* Используем имя файла (без расширения) как заголовок изображения: */
22 $title = implode('.',$file_parts);
23 $title = htmlspecialchars($title);
24
25 /* Если расширение входит в список обрабатываемых: */
26 if(in_array($ext,$allowed_types))
27 {
28
29 /* Если вы планируете хранить изображения в базе данных, вставьте код для запроса здесь */
30
31 /* Далее следует код, который разбирался в уроке */
32 /* Выводим каждое изображение: */
33
34 $nw = 150;
35 $nh = 100;
36 $source = $orig_directory . $file;
37 $stype = explode(".", $source);
38 $stype = $stype[count($stype)-1];
39 $dest = $thumb_directory . $file;
40
41 $size = getimagesize($source);
42 $w = $size[0];
43 $h = $size[1];
44
45 switch($stype) {
46 case 'gif':
47 $simg = imagecreatefromgif($source);
48 break;
49 case 'jpg':
50 $simg = imagecreatefromjpeg($source);
51 break;
52 case 'png':
53 $simg = imagecreatefrompng($source);
54 break;
55 }
56
57 $dimg = imagecreatetruecolor($nw, $nh);
58 $wm = $w/$nw;
59 $hm = $h/$nh;
60 $h_height = $nh/2;
61 $w_height = $nw/2;
62
63 if($w> $h) {
64 $adjusted_width = $w / $hm;
65 $half_width = $adjusted_width / 2;
66 $int_width = $half_width — $w_height;
67 imagecopyresampled($dimg,$simg,-$int_width,0,0,0,$adjusted_width,$nh,$w,$h);
68 } elseif(($w <$h) ($w == $h)) {
69 $adjusted_height = $h / $wm;
70 $half_height = $adjusted_height / 2;
71 $int_height = $half_height — $h_height;
72
73 imagecopyresampled($dimg,$simg,0,-$int_height,0,0,$nw,$adjusted_height,$w,$h);
74 } else {
75 imagecopyresampled($dimg,$simg,0,0,0,0,$nw,$nh,$w,$h);
76 }
77 imagejpeg($dimg,$dest,100);
78 }
79 }
80
81 /* Закрываем папку */
82 @closedir($dir_handle);
83
84 }


Заключение

С помощью такого скрипта можно существенно изменить стиль работы с изображениями при создании проекта. Ну а для тех, кто считает, что создание велосипеда — дело неблагодарное, есть готовые решения для создания миниатюр: Timthumb и PHPthumb (Описание по ссылкам на английском языке. Если вы хотите, чтобы мы сделали урок по использованию данных скриптов — пишите в комментариях).