PDA

Показать полную графическую версию : [решено] Миниатюры картинок с помощью пхп


Hitsi
14-09-2007, 13:27
Пользователь загружает на сайт картинки, которые в последующем выводятся на экран.
Картинки выводятся не в полный свой размер (чтобы уместолось несколько штук на странице). Как можно их переделать и вывести не делая при загрузке отдельной папочки с миниатюрами и не через жесткое указание высоты-ширины в теге img?
Есть варинат с временными фаилами.... но чтот их слишком много получается %)

XCodeR
14-09-2007, 17:49
Hitsi, посмотрите этот класс (http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php) и метод ouput()

Hitsi
15-09-2007, 20:02
Посмотрел, спасибо.... буду юзать. Вот только одна проблемка.
Сайт использует смарти, т.е. я в шаблон передаю переменную, а оутпут непосредственно выводит картинку. Как мне реализовать вывод этой картинки, т.е. что я должен передать в шаблон?
Сэйв сохраняет измененую на жестком диске.....

XCodeR
15-09-2007, 21:25
на том же сайте имеется пример вывода картинки:

include('SimpleImage.php');
$image = new SimpleImage();
$image->load($_FILES['uploaded_image']['tmp_name']);
$image->resizeToWidth(150);
$image->output();
Сайт использует смарти »
Поправьте немного исходный код вывода картинки.

Hitsi
16-09-2007, 16:11
обшибся........

Prisoner
19-09-2007, 19:07
Топик можно пометить решенным?

Hitsi
21-09-2007, 19:08
Нет.. вопрос остался открытым..... решен частично... спасибо за класс %)

Мне интересно как я должен изменить код чтобы передать "картинку" в шаблон. При $image->output() он моментально выводит эту картинку прямо во время выполнения кода.. т.е. картинка загружается даже еще до заголовков в самом начале страницы (даже не картинка а иероглифы).
Картинок много, сейчас в шаблон передается многомерный массив. Грубо говоря одному ряду массива соответсвует одна картинка.. там описан путь к ней, id автора, новые размеры.... А уже в шаблоне эта картинка выводится с жестко указанными размерами в теге img, которые просчитывались функцией (чтобы картинка не превышала определенных размеров, но при этом имела тоже самое соотношение высоты и ширины).
Т.е. я по сути имею туже самую картинку с темже "обьемом", только маленькую, что в общем-то неправильно и сильно загружает страницу.... Вот я и задал вопрос можно ли не используя дополнительной папки с миниатюрами (потомучто картинка выводится в нескольких местах с разными "максимально разрешенными" размерами... и отдельных миниатюр будет тоже много на каждую картинку) и без использования временных фаилов сделать то что хочется %)

Prisoner
22-09-2007, 03:33
Почему нет? Создайте скрипт-генератор тумб (миниатюр) который принимал бы в качеcтве параметра (ов) через GET габариты для тумбы и имя оригинала (источника для тумбы). В шаблоне вызывайте этот скрипт как банальный тег:
<img src="/thumb.php?width={$someWidth}&height={$someHeight}&image={$someImage}" width="{$someWidth}" height="{$someHeight}" alt="{$someAlt}">
Если таких тегов надо много, то передавайте в представление массив таких значений и генирируйте теги циклом.
Сам скрипт-генератор будет выглядеть примерно как указал XCodeR в первом своем посте. Если будут опять чудеса в виде даже не картинка а иероглифы », то поглядите правильные ли заголовки отправляет класс при попытке output в броузер. Должны быть признаки картинки. Подробнее здесь (http://ru2.php.net/manual/ru/function.imagejpeg.php) при поиске по ключевому слову header.

VeshchiyOleg
29-09-2007, 21:44
можно использовать библиотеку gd (она не установлена по умолчанию)
например, где нужны мелкие картинки писать
<img src="thumb.php?src=image.gif">
уменьшитель картинки
# thumb.php обработчик для gif, jpeg, png

$filename = 'path/to/images/dir/'.$src; # дописываем путь к каталогу с картинками
if ($size = getimagesize($filename)) {
switch ($size[2]) { # создаем загруженную картинку для обработки
case IMAGETYPE_GIF:
$img_src = imagecreatefromgif($filename);
break;
case IMAGETYPE_JPEG:
$img_src = imagecreatefromjpeg($filename);
break;
case IMAGETYPE_PNG:
$img_src = imagecreatefrompng($filename);
break;
}
$width_limit = 100; # лимит ширины
$height_limit = 100; # лимит высоты
$k = max($size[0] / $width_limit, $size[1] / $height_limit); # коэффициент уменьшения картинки
if ($k > 1) { # если надо, уменьшаем
$width = ceil($size[0] / $k);
$height = ceil($size[1] / $k);
$img_dst = imagecreatetruecolor($width, $height); # создаем маленькую картинку
imageinterlace($img_dst, 1); # это для ускорения загрузки - подробней - читай мануал
imagecopyresampled($img_dst, $img_src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
} else { # если нет - берем что есть
$img_dst = $img_src;
}
switch ($size[2]) {
case IMAGETYPE_GIF:
# вывод
header('Content-type: image/gif');
imagegif($img_dst);
# или сохранение
# imagegif($img_dst, 'path/to/save/'.$src);
# остальные по аналогии
break;
case IMAGETYPE_PNG:
header('Content-type: image/png');
imagepng($img_dst);
break;
case IMAGETYPE_JPEG:
header('Content-type: image/jpeg');
imagejpeg($img_dst);
break;
}
imagedestroy($img_dst); # подчищаем за собой
imagedestroy($img_src);
}

Hitsi
09-10-2007, 01:06
В предложеном классе ГД и используется....
тему можно закрывать, всем спасибо %)

Проблема была в моем незнании о работе скриптов под тегом img %)




© OSzone.net 2001-2012