Как пользователю сохранить картинку, сгенерированную PHP скриптом?

12
S1
На сайте с 12.07.2012
Offline
0
3103

есть скрипт создания демотиваторов

скрипт скачал отсюда - http://uvsr.stu.ru/dm/root_dm.zip и немного поменял под себя

работает он как тут - http://uvsr.stu.ru/dm/dm_create.php

при выводе на экран картинки сохранить ее на комп нельзя, только в формате хтмл страници...

подскажите как исправить данную проблему

а вот мой скрипт:

<?php

include ("dm.php");

// Печать демотиватора на экран

if (isset($_GET['dm'])) {

session_start();

$filename = $_SESSION['dm_fname'];

$slogan1 = $_SESSION['dm_slogan1'];

$slogan2 = $_SESSION['dm_slogan2'];

demotivator($filename,$slogan1,$slogan2);

unlink($filename);

exit;

}

// HTML-форма на экран

if (!isset($_POST["ok"])) {

print '<form action="dm_create.php" method="post" enctype=multipart/form-data>

<b>Изображение: </b><input type="file" name="filename"><br>

<b>1-й слоган: </b><input type="text" name="slogan1"><br>

<b>2-й слоган: </b><input type="text" name="slogan2"><br>

<input type="submit" name="submit" value="Создать демотиватор">

<input type="hidden" name="ok"></form>';

} else {

// Сохранение данных в сессии

session_start();

$_SESSION['dm_slogan1'] = $_POST['slogan1'];

$_SESSION['dm_slogan2'] = $_POST['slogan2'];

// Выбираем имя для файла

$fname = "";

for($x=0;$x<3;$x++) $fname = $fname.mt_rand(0,9);

$fname = $fname.".jpg";

copy ($_FILES['filename']['tmp_name'], "$fname");

$_SESSION['dm_fname'] = "$fname" ;

}

print '<html><title>Создание Демотиватора</title><body><h1>Ваш Демотиватор</h1><img src="dm_create.php?dm"><br><br><big>Если демотиватор отображается некорректно, например слоганы не вмещаются в изображение, значит слоганы слишком длинные. Если демотиватор не отображается, значит был загружен неподдерживаемый формат файла (должен быть JPG, GIF, PNG, BMP).</big><br><br>';

print '<form action="dm_create.php" method="post" enctype=multipart/form-data>

<b>Изображение: </b><input type="file" name="filename"><br>

<b>1-й слоган: </b><input type="text" name="slogan1"><br>

<b>2-й слоган: </b><input type="text" name="slogan2"><br>

<input type="submit" name="submit" value="Создать демотиватор">

<input type="hidden" name="ok"></form></body></html>';

?>

<?php

function demotivator($image, $slogan1, $slogan2) {

$fon = imagecreatefromjpeg('fon.jpg');

// преобразование win в utf

$slogan1 = dm_win2utf($slogan1);

$slogan2 = dm_win2utf($slogan2);

$ext = getimagesize($image);

// Открываем изображение

switch($ext[2]) {

case 2: {$img = ImageCreateFromJPEG($image); break;}

case 1: {$img = ImageCreateFromGIF($image); break; }

case 3: {$img = ImageCreateFromPNG($image); break;}

case 6: {$img = ImageCreateFromBMP($image); break;}

default : {

unlink ($image);

return 2;

}

}

// Получение размеров изображения

$x = ImageSX($img); // X

$y = ImageSY($img); // Y

//изменяем размер изображения до необходимого

if ($x<>725) {

$img3 = ImageCreateTrueColor(725, floor($y*725/$x));

$black = ImageColorAllocate($img3, 0, 0, 0);

ImageCopyResized($img3, $img, 0, 0, 0, 0, 725, floor($y*725/$x), $x, $y);

} else {

ImageCopyResized($img3, $img, 0, 0, 0, 0, $x, $y, $x, $y);

}

$x = ImageSX($img3); // X

$y = ImageSY($img3); // Y

$ny=$y+171;

$iy = 0;

if ($y>722) {

$iy = floor(($y-722)/2);

$ny=893;

}

// Создаем новое изображение

$img2 = ImageCreateTrueColor (842, $ny);

$black = ImageColorAllocate($img2, 0, 0, 0);

//подставляем фон для демотиватора

ImageCopyResized($img2, $fon, 0, 0, 0, 0, 842, $ny, 842, $ny);

//вставляем изображение на демотиватор

ImageCopyResized($img2, $img3, 58, 58, 0, $iy, $x, $y-2*$iy, $x,$y-$iy);

// Цвета рамки, слоганов и копирайта

$col = ImageColorAllocate($img2, 255, 255, 255); // Цвет слоганов

$col3 = ImageColorAllocate($img2, 255, 255, 255); // Цвет рамки

// Получение размеров изображения

$x = ImageSX($img2); // X

$y = ImageSY($img2); // Y

// Рамки на изображении

ImageRectangle($img2, 53, 53, 787, $y - 108, $col3);

ImageRectangle($img2, 52, 52, 788, $y - 109, $col3);

// Получение размеров изображения

$x = ImageSX($img3); // X

$y = ImageSY($img3); // Y

// Размер черного прямоугольника, который будем рисовать

$tx = $x * 0.1;

$ty = $x * 0.1;

$bx = $x + $tx;

$by = $y + $ty;

$dx= $x * 0.01; // Смещение. Необходимо для рисования рамки

$dy= $x * 0.01;

// Расчет смещений для рисования рамки

$x1 = $tx;

$y1 = $ty;

$x2 = $bx;

$y2 = $y + $ty;

// Пишем слоганы, сначала с X=0, чтобы получить линейные размеры текста

$s1 = ImageTTFText($img2, 0.04 * $bx, 0, $dx, $y+1000, $col, "times.ttf", $slogan1);

$s2 = ImageTTFText($img2, 0.030 * $bx, 0, $dx, $y+1000, $col, "arial.ttf", $slogan2);

// 1-й слоган не помещается в картинку - ошибка!

if (($s1[2] - $s1[0]) > $bx + $tx) $sl1 = 1;

$dx = (($bx + $tx) - ($s1[2] - $s1[0]))/2; // Смещение. Эта величина определяет центровку текста для 1-го слогана

// Непосредственно текст. 1-й слоган

ImageTTFText($img2, 0.04 * $bx, 0, $dx, $y+120, $col, "times.ttf", $slogan1);

$dx = (($bx + $tx) - ($s2[2] - $s2[0]))/2; // Смещение. Эта величина определяет центровку текста для 2-го слогана

// Непосредственно текст. 2-й слоган (таглайн)

if ($dx < 0) {

// Текст не умещается в картинку, масштабируем.

$s = $s2[2] - $s2[0];

$size = (0.030 * $bx * $bx) /$s;

$s2 = ImageTTFText($img2, $size, 0, $dx, $by + $ty + 0.08 * $bx, $col, "arial.ttf", $slogan2);

$dx = (($bx + $tx) - ($s2[2] - $s2[0]))/2;

ImageTTFText($img2, $size, 0, $dx, $by + $ty + 0.08 * $bx, $col, "arial.ttf", $slogan2);

} else {

$size = 0.030 * $bx;

ImageTTFText($img2, $size, 0, $dx, $y+160, $col, "arial.ttf", $slogan2);

}

Imagejpeg($img2);

ImageDestroy($img2);

ImageDestroy($img);

ImageDestroy($img3);

ImageDestroy($fon);

return 0;

}

// =========================================================================

// =========================================================================

// Преобразование win-1251 в UTF-8

// Взято с сайта: www.php.net, Автор: SiMM

function dm_win2utf($string){

if (function_exists("iconv")) {

$string = iconv("Windows-1251","UTF-8",$string);

return $string;

} else {

$out = '';

for ($i = 0; $i<strlen($string); ++$i){

$ch = ord($string{$i});

if ($ch < 0x80) $out .= chr($ch);

else

if ($ch >= 0xC0)

if ($ch < 0xF0)

$out .= "\xD0".chr(0x90 + $ch - 0xC0); // ***1040;-***1071;, ***1072;-***1087; (A-YA, a-p)

else $out .= "\xD1".chr(0x80 + $ch - 0xF0); // ***1088;-***1103; (r-ya)

else

switch($ch){

case 0xA8: $out .= "\xD0\x81"; break; // YO

case 0xB8: $out .= "\xD1\x91"; break; // yo

// ukrainian

case 0xA1: $out .= "\xD0\x8E"; break; // ***1038; (U)

case 0xA2: $out .= "\xD1\x9E"; break; // ***1118; (u)

case 0xAA: $out .= "\xD0\x84"; break; // ***1028; (e)

case 0xAF: $out .= "\xD0\x87"; break; // ***1031; (I..)

case 0xB2: $out .= "\xD0\x86"; break; // I (I)

case 0xB3: $out .= "\xD1\x96"; break; // i (i)

case 0xBA: $out .= "\xD1\x94"; break; // ***1108; (e)

case 0xBF: $out .= "\xD1\x97"; break; // ***1111; (i..)

// chuvashian

case 0x8C: $out .= "\xD3\x90"; break; // ***1232; (A)

case 0x8D: $out .= "\xD3\x96"; break; // ***1238; (E)

case 0x8E: $out .= "\xD2\xAA"; break; // ***1194; (SCH)

case 0x8F: $out .= "\xD3\xB2"; break; // ***1266; (U)

case 0x9C: $out .= "\xD3\x91"; break; // ***1233; (a)

case 0x9D: $out .= "\xD3\x97"; break; // ***1239; (e)

case 0x9E: $out .= "\xD2\xAB"; break; // ***1195; (sch)

case 0x9F: $out .= "\xD3\xB3"; break; // ***1267; (u)

}

}

return $out;

}

}

// =========================================================================

?>

KS
На сайте с 11.06.2012
Offline
17
#1

Попробуйте добавить:

header('Content-type: image/jpeg']);

вот здесь:

// Печать демотиватора на экран

if (isset($_GET['dm'])) {

session_start();

$filename = $_SESSION['dm_fname'];

$slogan1 = $_SESSION['dm_slogan1'];

$slogan2 = $_SESSION['dm_slogan2'];

header('Content-type: image/jpeg']);

demotivator($filename,$slogan1,$slogan2);

unlink($filename);

exit;

}

П.С.

Хочется особо отметить, вот как надо задавать вопросы! Максимум информации, всё что может понадобиться для решения проблемы. За решение такой задачи приятно браться, и такому спрашивающему приятно отвечать :-)

FileSafe (http://filesafe.anek.ws/) - мониторинг неизменности файлов сайта для защиты от взлома. Для форумчан - первый год бесплатно.
S1
На сайте с 12.07.2012
Offline
0
#2

выдает вот такую ошибку - "Parse error: parse error in C:\web_server\Apache\htdocs\dm_create.php on line 19"

KS
На сайте с 11.06.2012
Offline
17
#3

Прикрепите пожалуйста сюда этот файл dm_create.php (запакуйте зипом), чтобы можно было увидеть, что там на 19 строке и рядом.

S1
На сайте с 12.07.2012
Offline
0
#4

я в ПХП новичек... так что помогите пожалуйста)))

---------- Добавлено 12.07.2012 в 11:01 ----------

архив можно забрать здесь - http://www.ex.ua/view_storage/527470704197

IL
На сайте с 20.04.2007
Offline
435
#5

header('Content-type: image/jpeg');// скобка квадратная лишняя была 

p.s. по поводу простыни кода.. очень спорно

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
KS
На сайте с 11.06.2012
Offline
17
#6

Извиняюсь, моя ошибка, строка 19 должна быть такой:

header('Content-type: image/jpeg');

(я там лишнюю ] брякнул)

S1
На сайте с 12.07.2012
Offline
0
#7

огромное спасибо)

все работает прекрасно)))

____________________

я ведь только учусь)))

S1
На сайте с 12.07.2012
Offline
0
#8

есть еще одна проблема!!!

браузер Google Chrome сохраняет изображение, но открыть его невозможно

попробывал открыть как текст и вот что увидел:

<br />

<b>Warning</b>: getimagesize(375.jpg) [<a href='function.getimagesize'>function.getimagesize</a>]: failed to open stream: No such file or directory in <b>C:\web_server\Apache\htdocs\dm.php</b> on line <b>11</b><br />

<br />

<b>Warning</b>: unlink(375.jpg) [<a href='function.unlink'>function.unlink</a>]: No such file or directory in <b>C:\web_server\Apache\htdocs\dm.php</b> on line <b>21</b><br />

<br />

<b>Warning</b>: unlink(375.jpg) [<a href='function.unlink'>function.unlink</a>]: No such file or directory in <b>C:\web_server\Apache\htdocs\dm_create.php</b> on line <b>18</b><br />

что это может быть и как это исправить?

---------- Добавлено 13.07.2012 в 14:57 ----------

последняя версия скрипта здесь - http://www.ex.ua/view_storage/666126832452

---------- Добавлено 13.07.2012 в 14:59 ----------

в Opera и IE все работает....

dglstyle
На сайте с 24.03.2011
Offline
70
#9

Включать вывод ошибок и предупреждений нужно чтобы такого не было. Скорее всего проблема в правах, либо в отсутствии файлов

KS
На сайте с 11.06.2012
Offline
17
#10

Проблема в том, что в отличие от ИЕ и Оперы, Хром почему-то при сохранении картинки не берёт её из собственного кеша, а запрашивает заново с сервера. Я добавил ещё пару заголовков, чтобы сказать хрому, чтобы он не был таким щепитильным, и использовал кеш для картинки в течение часа. В прикриплении изменённый dm_create.php. На моём локальном компе вроде заработало в хроме.

zip dm_create.zip
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий