Рисование и сохранение

Ноябрь

Новичок
Рисование и сохранение

Я использую в <img src="… фаил, обрабатывающий изображение. При этом я хочу, чтобы изображение рисовалось лишь единожды, а в остальных случая подгружалось откуда-нибудь. Если в ImagePNG указывать имя файла, то изображение сохраняется, но не выводится на экран.
Как сделать, чтобы изображение и сохранялось, и выводилось на экран?
Когда у меня уже есть сохраненное изображение, то я смогу его показать, опять же, построив в этом php файле, есть ли какой-нибудь простой метод отображение картинки из директории через php.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Ноябрь
Мысли есть?
 

FractalizeR

Новичок
Это достаточно просто сделать. Только что проверил - работает.

В HTML пишем <img src="image.php?id=20" /> - тут параметры можно скрипту передать, а можно и не передавать, если не нужны.

В image.php определяем, надо ли нам генерить рисунок. Если надо, генерим, а потом делаем так:

PHP:
header("Location: ".$imageFileName);
die();
- редиректим браузер на нужный рисунок.

Можно, конечно, и в самом image.php этот рисунок отдать, если необходимо, но, кажется, это не то, что вам нужно?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Когда у меня уже есть сохраненное изображение
image_script.php
[m]if[/m] ![m]file_exists[/m]($output_file)
GD create image

[m]else[/m]
[m]header[/m]('Content-type:...........');
[m]readfile[/m]($output_file);
 

kode

never knows best
Автор оригинала: Ноябрь
ах.. спасибо:)
какие вы добрые сегодня:)

ps
>readfile()
Я бы долго искал..
Вопрос, а что тебе мешало:
1) Воспользоватся буферизацией вывода
2) Сделать двойной вывод (первый раз в файл, второй просто)?
 

Фанат

oncle terrible
Команда форума
по-моему, картинки надо генерить не там, где их показывают.
но если уж делать так, то я бы делал через мод-рерайт.
который направляет на пхп скрипт только в том случае, если живой картинки нету.
 

basboy

Новичок
ресайз картинок порядком напрягает сервер.
Если на странице картинок одна-две, то можно ресайзить при обращении.
но если превьюхи в галерее, то юзера ждёт долгая и утомительная загрузка.

мой взгляд ресайз нужно делать непосредственно при добавлении картинки в систему.
 

Ноябрь

Новичок
basboy
фишка в том, что ресайз делается единожды, а далее срабатывает readfile().

Фaнат
Не работал с мод-рерайт
у генерируемой картинки много параметров, не всегда удобно составлять изображение из названия неоткрывшегося файла, хотя, безусловно, до ума довести можно, все же, так, наверно, проще..

кстати мод-рерайт это опечатка? имелось ввиду mod_rewrite? просто в гугле темы про рерайт вылазят..

-~{}~ 08.01.08 16:27:

kode
А как здесь буферизацию вывода применить (я вдруг подумал..)?
 

Pigmeich

Новичок
Ноябрь
mod_rewrite всегда читался как мод-рерайт.

Мне кажется, фанaт тебе про другое писал - что надо картинки реально записывать на диск, а генерировать on-demand (при отсутствии на диске). В твоем случае, нормально использовать параметры и скрипт, наверно.
 

kode

never knows best
ну это кривой метод :)

ob_start();
imagepng();
file_put_contents("image.png",ob_get_flush());

не делайте так никогда :)))
 

kernel32

Новичок
kode
Конечно, в этом коде смысла особого нет :)
Будем каждый раз вызывать этот скрипт, и он в свою очередь будет каждый раз в image.png записывать... :)
 

kode

never knows best
Правильнее было бы юзать такой код:

PHP:
<?php
// ex: /thumbnails/my_dog.jpg or thumbnail.php?image=my_dog.jpg

//mod_rewrite или напрямую из get
$filename = (!isset($_GET['image']))?array_pop(explode("/",$_SERVER['REQUEST_URI'])):$_GET['image'];

$ext = str_replace("jpg","jpeg",strtolower(array_pop(explode('.',$filename))));

$original_filename = "images/{$filename}";
$thumbnail_filename = "images/thumb.".substr($filename,0,-1*(strlen($ext)+1)).".png";

//Проверяем существует ли миниатюра уже?
if(file_exists($thumbnail_filename)){
	readfile($thumbnail_filename);
	die();
}

//Проверяем наличие файла
if(!file_exists($original_filename)){
	readfile("images/notfound.jpg");
	die();
}

$info = getimagesize("images/{$filename}");

$width = 300;
$height = $source_h * ($info[1] / $info[0]); //Сохраняем пропорции

$im = imagecreatetruecolor($width+4,$height+52);

switch ($info[2]){
	case IMAGE_GIF:
		$original_image = imagecreatefromgif($original_filename);
		break;
	case IMAGE_JPEG:
		$original_image = imagecreatefromjpeg($original_filename);
		break;
	case IMAGE_PNG:
		$original_image = imagecreatefrompng($original_filename);
		break;
}

/*
А вот так красивее, но делать так не стоит:

if(!in_array($ext,array('jpeg','gif','png'))){
die('Invalid format!');
}
eval('$original_image = imagecreatefrom'.$ext.'($original_filename);')
*/

imagefill($im,0,0,0x000000);
imagecopymerge($original_image,$im,2,2,0,0,$info[0],$info[1],100); //100 много - поставьте поменьше, 60-80 хватит

//Вот тут подкрутите значение $y - мб чуть пониже надо
imagestring($im,2,5,$height+10,"Thumbnail",0xFFFFFF);

imagepng($im,"images/thumb.{$filename}.png");

header('Content-Type: image/png');
imagepng($im);

?>
написал за 5 минут, не тестил :)
 
Сверху