[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод изображений
Gesandte
Добрый день.
Собственно впервые работаю с графическими функциями в 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. Там только что закончился конкурс по работе с графикой. И есть доступ к исходным кодам всех работ.
Смотри, как там всё сделано smile.gif

Спустя 1 час, 37 минут, 5 секунд (25.06.2010 - 10:52) Gesandte написал(а):
Так.......
Сделал файл костыль, 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 написал(а):
smile.gif smile.gif smile.gif столько слов, что решил докачать послднение 2 скрипта, при просмотре одного из них в браузере, на рез-т формирования изображения "допер" передавать путь к картинке черех GET, именно по этому до этого я не мог сообразить как сделать в цикле. Ну теперь все работает.))) Спасибо за помощь wink.gif

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

sergeiss, дальше ссылаться на те примеры нет смысла, там тот же алгоритм, что н аданный момент у меня. Файл с обработчиком подключается в скрипт формирования изображения. Тем самым если сделать там цикл то один и тот же обработчик будет грузится в каждом проходе цикла....

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

Никакакой алгоритм в голову не приходит? smile.gif

Спустя 16 часов, 5 минут, 43 секунды (26.06.2010 - 10:22) vagrand написал(а):
Gesandte

Тебе в первую очередь надо думать о кеширования ресайзнутой картинки, а не о создании объекта в цикле.

Спустя 6 часов, 12 минут, 1 секунда (26.06.2010 - 16:34) Gesandte написал(а):
А чего об этом думать то?
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 написал(а):
ну да, впринципе можно smile.gif только придется добавить еще очистку данной папки с превьюшками при смене настроек вывода.

Но все же, если вернуться к тому вопросу)
Вот смотри, если даже опустить те 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.
Цитата
ну да, впринципе можно smile.gif только придется добавить еще очистку данной папки с превьюшками при смене настроек вывода.


Для очистки можно либо написать кронскрипт либо просто рандомно очищать. Так же хорошим решением будет давать имя фалу тумбы, которое получается путем хеширования всех текущих параметров скрипта, т.е. пути к сурцу, размеров и т.д.

Спустя 1 час, 39 минут, 56 секунд (27.06.2010 - 12:22) Gesandte написал(а):
Ясно, еще тогда можно добавить referer, ну да ладно. Доработаю потом. wink.gif

Думаю посмотреть какойнить проф. скрипт галлереи. Может там что интересное найду smile.gif

Спустя 2 минуты, 1 секунда (27.06.2010 - 12:24) Gesandte написал(а):
А крон не потянет) надо очишать именно в момент смены настроек вывода (формат, тип ресаза, размеры и тд), не проблема это реализовать smile.gif пару строк тока дописать
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.