Создание миниатюр на PHP
by Вредный • 03.12.2009 • php, программирование • Комментарии [6]
Часто бывает нужным создание пропорционально уменьшенных миниатюр фотографий или больших картинок (thumbnail). В основном это применяется для галерей, но порой нужно переслать кому-то много фотографий, а интернет-канал не шибко широкий. Вот для этих целей и подойдет мой маленький скрипт на PHP, уменьшающий изображения из указанной папки и сохраняя полученные картинки в папку со скриптом (пути легко настраиваются).
Пока мы умеем работать только с jpg, на этот скрипт послужит, скорее всего, началом к созданию галереи на jQuery и PHP, как единого целого. Хватит слов, перейдем к делу.
Создаем скрипт
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <?php $width = 300; $height = 200; //задаем размеры миниатюр foreach (glob("./imgs/*.jpg") as $filename) { $i++; //будущее название миниатюры $size = getimagesize($filename); //размер изображения $format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1)); //mime-тип $icFunc = "imagecreatefrom" . $format; //создаем изображение на основе mime-типа $xRatio = $width / $size[0]; $yRatio = $height / $size[1]; //высчитываем пропорции и определяем наибольшую сторону //чтобы было пропорционально $ratio = min($xRatio, $yRatio); $use_x_ratio = ($xRatio == $ratio); $new_width = $use_x_ratio ? $width : floor($size[0] * $ratio); $new_height = !$use_x_ratio ? $height : floor($size[1] * $ratio); $new_left = $use_x_ratio ? 0 : floor(($width - $new_width) / 2); $new_top = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2); //непосредственно сам ресайз $isrc = $icFunc($filename); $idest = imagecreatetruecolor($width, $height); imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]); //создаем изображение и записываем его в файл //!!!ОБЯЗАТЕЛЬНО: папка, куда сохраняем должна доступна быть для записи imagejpeg($idest, "$i.jpg", 100); imagedestroy($isrc); imagedestroy($idest); echo "<img src=\"$i.jpg\" />"; //выводим череду миниатюр, полученныз из больших картинок } ?> |
После нам нужно найти кучу фотографий большого объема и сохранить их в папку imgs, расширение у файлов должно быть jpg.
Запускаем скрипт и вуаля, получаем в папке со скриптом миниатюры, размеры которых легко задаются в начале скрипта PHP.
Результат выполнения скрипта можно узреть тут. Все получено из фотографий более чем 3хмегабайтного размера.
скрипт искажает миниатюру до неузнаваемости! как сделать, чтобы пропорционально уменьшал?
у меня вроде нормально уменьшает, приведите пример неправильно работающего кода
спасибо
Интересно а как можно уменьшить изображение не пропорыционально а чтобы был один размер у мини картинок и при том не искажались пропорции
для этого нужно заполнять чем-нибудь получающиеся границы
$new_height = !$use_y_ratio ? $height : floor($size[1] * $ratio);
нужно исправить на
$new_height = !$use_x_ratio ? $height : floor($size[1] * $ratio);
а заливку делать надо либо белым
$idest = imagecreatetruecolor($width, $height);
imagefill($idest, 0, 0, 0xffffff);
либо любым другим цветом
вы правы, спасибо за исправления