Собственно впервые работаю с графическими функциями в php. Вот решил сделать галлерею.
Функция ресайза написана, работает...но не как хотелось бы. В итоге наблюдается 2 косяка:
1. Вывод изображений будет в цикле, но при этом выводится только первое изображение.
2. Изображение выводится, но если осуществит вывод какого либо контента ло этого момента, то вместо иображения получаем каракули всякого рода.
Вроде посмотрел в инете, рекомендуют выводить таким образом сформированные изображения через тег img, но результат тот же....
<?php
class imageresize {
public $image = array();
function image_resize() {
..........
# Выводим изображение
$this->image_print();
}
function image_print() {
# Выводим изображение
switch ($this->image[type_content]) {
case '1':
header('Content-Type: image/gif');
imagegif($this->image[dest]);
break;
case '2':
header('Content-Type: image/jpeg');
imagejpeg($this->image[dest]);
break;
case '3':
header('Content-Type: image/png');
imagepng($this->image[dest]);
break;
}
# Очищаем память
imagedestroy($this->image[source]);
imagedestroy($this->image[dest]);
}
}
$images = array('aaa.jpg', '051.jpg');
$imageresize = new imageresize();
$imageresize->image[type_content] = "3";
/*
echo "
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\">
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
<title>title</title>
</head>
<body>
";
*/
for ($i = 0; $i < count($images); $i++) {
$imageresize->image[path] = $images[$i];
if (file_exists($imageresize->image[path])) {
# $imageresize->image_resize();
echo "<img src=\"".$imageresize->image_resize()."\" alt=\"\" /><br />";
}
}
echo "</body>
</html>";
?>
В браузере, в обоих случаях, генерируется строка
<img src="http://localhost/test/gallery/index3.php" alt="http://localhost/test/gallery/index3.php">
П.С. В реальности все конечно берется из БД
Спасибо за внимание.
Спустя 20 часов, 32 минуты, 8 секунд (25.06.2010 - 09:11) vagrand написал(а):
Ты не верно понял принцип вывода имаджа через тег img. Нужно написать отдельный скрипт или сделать отдельный экшен в существующем скрипте, который бы отдавал только имадж и только один за раз. А потом уже в HTML вызывай этот скрипт столько раз сколько нужно просто заменив ему параметры.
Спустя 3 минуты, 43 секунды (25.06.2010 - 09:15) sergeiss написал(а):
Еще - можешь посмотреть раздел конкурсов http://phpforum.ru/index.php?showforum=133. Там только что закончился конкурс по работе с графикой. И есть доступ к исходным кодам всех работ.
Смотри, как там всё сделано
Смотри, как там всё сделано
Спустя 1 час, 37 минут, 5 секунд (25.06.2010 - 10:52) Gesandte написал(а):
Так.......
Сделал файл костыль, 2-ой вопрос разрешился.
index.php
И собственно сам костыль
Но насчет вывода в цикле все становится еще более туманным.....
Задать парметры в index.php у меня так и невышло, в этом случаем никакое изображение не генерируется.
sergeiss, к сожалению в тех примерах генерируется только одно изображение.
Сделал файл костыль, 2-ой вопрос разрешился.
index.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Gallery</title>
</head>
<body>
<h3>Images</h3>
<img src="image.php" alt="" /><br />
</body>
</html>
И собственно сам костыль
<?php
require "imageresize.php";
$imageresize = new imageresize();
$imageresize->image[path] = "aaa.jpg";
$imageresize->image[type_resize] = "2";
$imageresize->image[type_content] = "3";
$imageresize->image[dest_w] = "400";
$imageresize->image[dest_h] = "200";
$imageresize->image_resize();
?>
Но насчет вывода в цикле все становится еще более туманным.....
Задать парметры в index.php у меня так и невышло, в этом случаем никакое изображение не генерируется.
sergeiss, к сожалению в тех примерах генерируется только одно изображение.
Спустя 3 часа, 41 минута, 12 секунд (25.06.2010 - 14:33) sergeiss написал(а):
Цитата (Gesandte @ 25.06.2010 - 11:52) |
sergeiss, к сожалению в тех примерах генерируется только одно изображение. |
Ты обрати внимание на сам принцип. Есть некий скрипт, который строит графики. А это могут быть и уменьшения других картинок... И вызывается этот скрипт столько раз из основного скрипт, сколько тебе нужно!!!
Ведь есть же у тебя, допустим, тэг input. И ты вызываешь его на одной странице столько раз, сколько хочешь! А картинка вызывается из тэга img - его тоже вызываешь столько раз, сколько хочешь. Указывай там имя одного и того же скрипта - построителя картиной, но только с разными параметрами.
На конкурс я указал потому, что описанный форумачанином vagrand алгоритм ты можешь посмотреть в конкурсных работах в "живом" виде.
Спустя 3 часа, 43 минуты, 13 секунд (25.06.2010 - 18:16) Gesandte написал(а):
столько слов, что решил докачать послднение 2 скрипта, при просмотре одного из них в браузере, на рез-т формирования изображения "допер" передавать путь к картинке черех GET, именно по этому до этого я не мог сообразить как сделать в цикле. Ну теперь все работает.))) Спасибо за помощь
Но вот терзают сомнения, с ООП на самом деле не особо знаком, несмотря на то что использю данный подход в написании этого скрипта. Так вот, насколько правильно в каждом проходе цикла создавать объект класса заново? Да и файл ресайза там каждый раз грузиться, что больше грузит сервер.....
sergeiss, дальше ссылаться на те примеры нет смысла, там тот же алгоритм, что н аданный момент у меня. Файл с обработчиком подключается в скрипт формирования изображения. Тем самым если сделать там цикл то один и тот же обработчик будет грузится в каждом проходе цикла....
Хочется сделать что бы обработчик все же как нибудь подключался один раз, а в цикле шло только задействование соответсвующих функций, но что то пока ничего не придумывеатся. По сути как бы из файла image.php убрать инструкцию require и поместить ее например в index.php
Никакакой алгоритм в голову не приходит?
Но вот терзают сомнения, с ООП на самом деле не особо знаком, несмотря на то что использю данный подход в написании этого скрипта. Так вот, насколько правильно в каждом проходе цикла создавать объект класса заново? Да и файл ресайза там каждый раз грузиться, что больше грузит сервер.....
sergeiss, дальше ссылаться на те примеры нет смысла, там тот же алгоритм, что н аданный момент у меня. Файл с обработчиком подключается в скрипт формирования изображения. Тем самым если сделать там цикл то один и тот же обработчик будет грузится в каждом проходе цикла....
Хочется сделать что бы обработчик все же как нибудь подключался один раз, а в цикле шло только задействование соответсвующих функций, но что то пока ничего не придумывеатся. По сути как бы из файла image.php убрать инструкцию require и поместить ее например в index.php
Никакакой алгоритм в голову не приходит?
Спустя 16 часов, 5 минут, 43 секунды (26.06.2010 - 10:22) vagrand написал(а):
Gesandte
Тебе в первую очередь надо думать о кеширования ресайзнутой картинки, а не о создании объекта в цикле.
Тебе в первую очередь надо думать о кеширования ресайзнутой картинки, а не о создании объекта в цикле.
Спустя 6 часов, 12 минут, 1 секунда (26.06.2010 - 16:34) Gesandte написал(а):
А чего об этом думать то?
imagedestroy и все.
imagedestroy и все.
Спустя 57 минут, 22 секунды (26.06.2010 - 17:31) Gesandte написал(а):
да и настройки передвать в таком случае как... не гетом же...
Спустя 15 часов, 39 минут, 30 секунд (27.06.2010 - 09:11) vagrand написал(а):
imagedestroy - удаляет ресуры затраченные на преобразование картинки. Под кешированием я понимал совсем другое. В твоем алгоритме каждый раз при загрузке страницы снова и снова будут нарезаться тумбы, хотя это можно было бы сделать только один раз, сохранив эти тумбы на диске, а при повторе просто проверять есть ли они там и если есть то делать на них редирект.
Спустя 22 минуты, 20 секунд (27.06.2010 - 09:33) Gesandte написал(а):
ну да, впринципе можно только придется добавить еще очистку данной папки с превьюшками при смене настроек вывода.
Но все же, если вернуться к тому вопросу)
Вот смотри, если даже опустить те 2 вопроса насчет объекта класса и подгружаемого класса ресайза в скрипт формирования картинки image.php
Мне надо еще передать в этот файл, помимо пути до картики, еще целый ряд настроек из БД. И если, как я писал раньше, путь до картинке я передаю через $_GET
То передавать еще и настройки таким образом как то совсем нехочется, мало того сама строка уж сильно здоровая будет, так еще и какие нить тролли смогут передать свои параметры скрипту.
Получать настройки непосредственно в image.php, то же бред. Тогда еще при каждом приходе цикла будет происходить запрос к БД для получения одних и тех же настроек.
То есть надо как то все таки алгоритм вывода модернизировать.......
Но все же, если вернуться к тому вопросу)
Вот смотри, если даже опустить те 2 вопроса насчет объекта класса и подгружаемого класса ресайза в скрипт формирования картинки image.php
Мне надо еще передать в этот файл, помимо пути до картики, еще целый ряд настроек из БД. И если, как я писал раньше, путь до картинке я передаю через $_GET
echo "<img src=\"image.php?image=$image\" alt=\"\" />";
То передавать еще и настройки таким образом как то совсем нехочется, мало того сама строка уж сильно здоровая будет, так еще и какие нить тролли смогут передать свои параметры скрипту.
Получать настройки непосредственно в image.php, то же бред. Тогда еще при каждом приходе цикла будет происходить запрос к БД для получения одних и тех же настроек.
То есть надо как то все таки алгоритм вывода модернизировать.......
Спустя 1 час, 8 минут, 59 секунд (27.06.2010 - 10:42) vagrand написал(а):
1. Никак кроме как через GET ты в данном случае скрипту параметры не передашь;
2. Чтобы твой скрипт не использовали для ресайза картинок с других сайтов просто не принимай в качестве пути URL-ы, а так же принимай только относительные пути;
3.
2. Чтобы твой скрипт не использовали для ресайза картинок с других сайтов просто не принимай в качестве пути URL-ы, а так же принимай только относительные пути;
3.
Цитата |
ну да, впринципе можно smile.gif только придется добавить еще очистку данной папки с превьюшками при смене настроек вывода. |
Для очистки можно либо написать кронскрипт либо просто рандомно очищать. Так же хорошим решением будет давать имя фалу тумбы, которое получается путем хеширования всех текущих параметров скрипта, т.е. пути к сурцу, размеров и т.д.
Спустя 1 час, 39 минут, 56 секунд (27.06.2010 - 12:22) Gesandte написал(а):
Ясно, еще тогда можно добавить referer, ну да ладно. Доработаю потом.
Думаю посмотреть какойнить проф. скрипт галлереи. Может там что интересное найду
Думаю посмотреть какойнить проф. скрипт галлереи. Может там что интересное найду
Спустя 2 минуты, 1 секунда (27.06.2010 - 12:24) Gesandte написал(а):
А крон не потянет) надо очишать именно в момент смены настроек вывода (формат, тип ресаза, размеры и тд), не проблема это реализовать пару строк тока дописать