Навигация
Календарь
«    Август 2007    »
ПнВтСрЧтПтСбВс
 
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
 
Популярное
Дружественные ресурсы
29 августа 2007 :

Автоматическое создание thumbnails (тумбы, превьюшки) на php.

Идея скрипта.

Закачать картинку единожды, а потом выложить на сайт в любое время, в любом формате, размере и типе файла.
Возможный url для вставки картинки может быть таким: http://www.example.com/img.php?f(filename)+w(300).
Используя этот url, мы можем вставить картинку с именем filename, размером 300px по ширине и соответствующей высоте.

Определимся с возможностями скрипта:
1. Изменение размеров изображения по ширине или высоте с сохранением пропорций.
2. Устанавка размера нового изображения как в пикселах, так и в процентах от исходной картинки.
3. Изменение размеров изображения в случае превышения определенного значения.
4. Возврат изображения в .jpg или .png формате.

Необходимое.

Для написания этого скрипта нам нужен собственно PHP и графическая библиотека GD.

Синтаксис для работы со скриптом.

Для вызова скрипта будем использовать определенный синтаксис. Все аргументы будем разделять только знаками минуса(-) или плюса(+): http://www.example.com/img.php?f(filename)+w(300).

f(filename) - имя запрашиваемого изображения. Файл с изображением должен быть сохранен на сервере БЕЗ расширения, длина имени файла - 13 символов, например fjghtykbndohj.
w(123) или w(10%) - необходимая ширина изображения на выходе. Задается в пикселах или процентах.
h(123) или h(10%) - то же самое для высоты результирующего изображения.
x(123) или y(123) - значение ширины или высоты, превышать которое не допустимо.
t(png|jpg) - установка типа файла, в котором надо вывести результирующее изображение. Если значение не задано, тип устанавливается аналогичным исходному файлу.
q(100) - только для файлов jpg. Устанавливает качество результирующего изображения. Принимает значения от 0 до 100.

Теперь давайте рассмотрим код самого скрипта.

Проверка аргументов.

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


<?
// папка с изображениями
$base_img_dir = "./img/";
// поиск аргументов
preg_match_all("/+*(([a-z])(([^)]+)))+*/", $QUERY_STRING,
$matches, PREG_SET_ORDER);
// пустой массив и выражения для проверки аргументов
$tags = array();
$check = array( "f" => "[0-9a-zA-Z]{13}",
"w" => "[0-9]+%?",
"h" => "[0-9]+%?",
"x" => "[0-9]+",
"y" => "[0-9]+",
"t" => "jpg|png",
"q" => "1?[0-9]{1,2}" );
// проверка значений аргументов и сохранение в массив
for ($i=0; $i<count($matches); $i++) {
if (isset($check[$matches[$i][2]])) {
if (preg_match('/^('.$check[$matches[$i][2]].')$/',
$matches[$i][3])) {
$tags[$matches[$i][2]] = $matches[$i][3];
}
}
}
function notfound() {
header("HTTP/1.0 404 Not Found");
exit;
}
// проверим, что имя файла передано
if (!isset($tags["f"])) {
notfound();
}
// проверим, что файл существует
if (!file_exists($base_img_dir.$tags["f"])) {
notfound();
}
?>


Загрузка изображения.

Следующим шагом осуществим загрузку картинки.

<?
// получаем информацию об изображении
$imginfo = getimagesize($base_img_dir.$tags["f"]);
// загружаем его
switch ($imginfo[2]) {
case 2: // jpg
$img_in = imagecreatefromjpeg($base_img_dir.$tags["f"]) or notfound();
if (!isset($tags["t"])) {
$tags["t"] = "jpg";
}
break;
case 3: // png
$img_in = imagecreatefrompng($base_img_dir.$tags["f"]) or notfound();
if (!isset($tags["t"])) {
$tags["t"] = "png";
}
break;
default:
notfound();
}
?>


Изменение размеров изображения.

<?
// проверяем максимальные ширину и высоту
if (isset($tags["x"])) {
if ($tags["x"] < imagesx($img_in)) {
$tags["w"] = $tags["x"];
}
}
if (isset($tags["y"])) {
if ($tags["y"] < imagesy($img_in)) {
$tags["h"] = $tags["y"];
}
}
// проверяем необходимость изменения размера
if (isset($tags["h"]) or isset($tags["w"])) {
// convert relative to absolute
if (isset($tags["w"])) {
if (strstr($tags["w"], "%")) {
$tags["w"] = (intval(substr($tags["w"], 0, -1)) / 100) *
$imginfo[0];
}
}
if (isset($tags["h"])) {
if (strstr($tags["h"], "%")) {
$tags["h"] = (intval(substr($tags["h"], 0, -1)) / 100) *
$imginfo[1];
}
}
// изменениe размера
if (isset($tags["w"]) and isset($tags["h"])) {
$out_w = $tags["w"];
$out_h = $tags["h"];
} elseif (isset($tags["w"]) and !isset($tags["h"])) {
$out_w = $tags["w"];
$out_h = $imginfo[1] * ($tags["w"] / $imginfo[0]);
} elseif (!isset($tags["w"]) and isset($tags["h"])) {
$out_w = $imginfo[0] * ($tags["h"] / $imginfo[1]);
$out_h = $tags["h"];
} else {
$out_w = $tags["w"];
$out_h = $tags["h"];
}
// вывод нового изображения в $img_out
$img_out = imagecreate($out_w, $out_h);
imagecopyresized($img_out, $img_in, 0, 0, 0, 0, imagesx($img_out),
imagesy($img_out), imagesx($img_in), imagesy($img_in));
} else {
// изменять размеры не надо
$img_out = $img_in;
}
?>


Вывод изображения.

<?
// проверяем, надо ли установить качество в случае если на выходе jpg
if (!isset($tags["q"])) {
$tags["q"] = 75;
}
// вывод изображения
switch ($tags["t"]) {
case "jpg":
header("Content-type: image/jpeg");
imagejpeg($img_out, "", $tags["q"]);
exit;
case "png":
header("Content-type: image/png");
imagepng($img_out);
exit;
default:
notfound();
}
?>


Скачать файл примера целиком: thumbs.zip [12.08 Kb] (cкачиваний: 185)

Похожие новости:
  • Конвертация изображения в grayscale с помощью PHP и библиотеки GD.
  • Ограничение количества загрузок с одного IP-адреса.
  • Как узнать, когда на сайт заходил поисковый бот?
  • Asus EEE PC 701 - мечты сбываются.
  • Ноутбук Asus VX2 yellow
  •  (голосов: 7)
    Автор: wstudio Дата: 4 декабря 2007 20:29 ICQ: --
    При выводе превьюшки изображение становится корявым в плане шумов и прочей ерунды. Некоторые вообще начинают отображаться инвертироваными (инверсия цвета). Это можно вылечить?
    [ ]
    Автор: turist Дата: 8 февраля 2008 14:18 ICQ: --
    Очень полезная для меня инфо
    [ ]
    Автор: Хотохори Дата: 25 февраля 2008 07:47 ICQ: --
    Видел когда-то этот скрипт на этом сайте, там он использовался для уменьшения картинок из аниме. Так вот там превьюшки отображались нормально, тогда как у меня они обесцвечиваются почему-то sad
    [ ]
    Автор: http://univer.by Дата: 6 апреля 2008 13:00 ICQ: --
    Мне тоже инфа понравилась! Спасибо
    [ ]
    Автор: http://kuroi-kaze-85.livejournal.com Дата: 28 май 2008 21:32 ICQ: --
    Image Magick сделает то же самое одной строкой.
    [ ]
    Автор: Tranquil Дата: 15 июля 2008 18:46 ICQ: --
    Надо magecopyresized заменить на magecopyresampled, параметры подправить и будет все ок!
    [ ]
    Автор: Dune Дата: 3 сентября 2008 09:26 ICQ: --
    Картинки получаются чуть размытые при изменении масштаба через php.
    Лечил так: картинки изменяются до размера большего чем надо, а в свойствах (ширина, высота) ставится размер нужный - браузер картинки грубо уменьшает без интерполяции - появляется чёткость.
    [ ]
    Автор: Lisica Дата: 15 сентября 2008 15:12 ICQ: --
    о как лабораторные нуно делать...
    [ ]
    Автор: Джуди Дата: 21 сентября 2008 16:43 ICQ: --
    Ну прям совсем автоматическое !
    [ ]
    Автор: Messiah Дата: 22 сентября 2008 10:55 ICQ: --
    Шикарно. Да, кстати, меня Витей зовут :)
    [ ]
    Автор: pannochka Дата: 24 сентября 2008 21:23 ICQ: --
    Спасибо за идею!
    [ ]
    Автор: kontriceps Дата: 8 октября 2008 06:44 ICQ: --
    Неплохо бы еще было увеличить количество авторов на сайте.
    [ ]
    Автор: vipmgarkuns Дата: 9 ноября 2008 01:01 ICQ: --
    Красиво сказано. строительство стендов
    [ ]
    Автор: rieltorimiav Дата: 10 ноября 2008 21:48 ICQ: --
    Отличный сайт, прям как у нас. рынок жилой недвижимости
    [ ]
    Автор: stroysjmi Дата: 13 ноября 2008 22:14 ICQ: --
    [ ]
    Автор: qwer Дата: 20 ноября 2008 23:28 ICQ: --
    Все о Дом2 тут
    [ ]
    Автор: manson17 Дата: 23 ноября 2008 17:29 ICQ: --
    [ ]