[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Скрипт наложения текста на GIF
NuT
Код
<?
Header("Content-type: image/gif");
$im = ImageCreateFromGif("../image/MM_button_20x150.gif"); // путь к фаилу правилен, фаил существует и называется именно так
$LightGrey= ImageColorAllocate($im, 250, 250, 250);
ImageString($im, 3, 3, 1, "Test", $LightGrey);
ImageGif($im);
ImageDestroy($im);
?>

Если его поместить в пустой фаил tpl/btn1.php - выводит GIF с текстом. Если такой-же скрипт поместить внутри тэгов <BODY> - не работает, выводит абра-кадабру "GIF98#вапЫпцКЙХХхХХХ{{{{}[(К)Про". Даже при включенном <?ini_set('display_errors',1); error_reporting(E_ALL); ?> никаких ошибок не показывает.

Такая же проблема если пытаться из основного index.php обратиться к рабочему tpl/btn2.php путём <img src="tpl/btn2.php?text=test">.
Код btn2.php:
Код
<?
Header("Content-type: image/gif");
$string=$_GET['text'];
$im = ImageCreateFromGif("../image/MM_button_20x150.gif"); // путь к фаилу правилен, фаил существует и называется именно так
$LightGrey= ImageColorAllocate($im, 250, 250, 250);
ImageString($im, 3, 3, 1, $string, $LightGrey);
ImageGif($im);
ImageDestroy($im);
?>


Не нашел вразумительного ответа на форуме. Если же он есть, а я просмотрел - звиняйте )



Спустя 35 минут, 37 секунд (6.03.2008 - 10:31) mazahaka написал(а):
Цитата(NuT @ 6.3.2008, 6:55) [snapback]34684[/snapback]
Не нашел вразумительного ответа на форуме. Если же он есть, а я просмотрел - звиняйте )

К великому сожалению у тебя так не когда не получиться есть два решения этой проблемы.
1) Использовать iframe при вставке имейджа
2) Сохранять рисунок и выводить его

Спустя 11 минут, 18 секунд (6.03.2008 - 10:42) NuT написал(а):
Я вижу кучу решений этой "задачи":
1. Ячейка таблицы с фоном - GIF-ом и текстом, причем cellpadding/align/valign можно вычислять из длины строки. // Увеличит размер кода/страницы, уменьшит общее быстродействие
2. Сохранять рисунок во временном GIF-е и выводить его с последующим удалением. // Увеличит нагрузку на сервер (Из-за количества обращений чтения/записи на HDD серверной машины)
3. Использовать iFrame. // По поводу iFrame много разрозненной информации неправильной поддержки некоторыми браузерами и поисковыми системами
Но, ведь, приведенный мной код - стандартное решение PhP, описанное даже в Официальных Документах. Самое, по-моему, быстрое и верное из перечисленных решений. Почему не работает? =)

Все комменты - строгое ИМХО.

Спустя 23 минуты, 55 секунд (6.03.2008 - 11:06) vasa_c написал(а):
Цитата
Такая же проблема если пытаться из основного index.php обратиться к рабочему tpl/btn2.php путём <img src="tpl/btn2.php?text=test">.

Какая проблема? Выводится абракадабра?
Вы уверены, что путь относительный путь "tpl/btn2.php" разрешается правильно от каталога с index.php?

Цитата
Сохранять рисунок во временном GIF-е и выводить его с последующим удалением. // Увеличит нагрузку на сервер (Из-за количества обращений чтения/записи на HDD серверной машины)

Если для каждого вызова генерировать, то увеличит. А если один на несколько запросов, то существенно снизит.

Спустя 24 минуты, 20 секунд (6.03.2008 - 11:31) NuT написал(а):
Цитата
Какая проблема? Выводится абракадабра?
Вы уверены, что путь относительный путь "tpl/btn2.php" разрешается правильно от каталога с index.php?

Да, выводится абра-кадабра во всех случаях, вместо GIF-а.
Уверен, ибо команды include("tpl/header.php") работают верно.
При неверных путях выводится мелкий прямоугольник с красным крестом в центре.

Цитата
А если один на несколько запросов, то существенно снизит.

Можно чуть подробнее? Я всё-таки начинающий) Грубо говоря задача такая:
1. Проверка на аутентификацию.
2. Если посетитель не зарегистрировался, в меню выводится последовательность кнопок с текстом поверх Пункт 1, Пункт 2, Пункт 3. При каждом переходе по этим ссылкам загружается новая страница (допустим page1.php, page2.php) и заново генерируется это меню.
3. Если посетитель зарегистрировался, в меня выводится последовательность кнопок с текстом поверх Пункт 1, Пункт 2, Пункт 3, Пункт 4 и Пункт 5. При каждом переходе по этим ссылкам загружается новая страница (допустим page1.php, page2.php) и заново генерируется это меню.

Спустя 21 минута, 49 секунд (6.03.2008 - 11:52) lenich написал(а):
Скорей всего вы сетки намудили с путями.
GIF98#вапЫпцКЙХХхХХХ{{{{}[(К)Про - похоже на данные GIF картинки.
Цитата
Если такой-же скрипт поместить внутри тэгов <BODY> - не работает

Не понял что значит поместить в body. Картинку чтоли в боди?
<img src="tpl/btn2.php?text=test"> - вот так и должно быть. Если абракадабра выводится, то скорее всего клиенту пошел левый контент, а не гиф картинка. Такое бывает, когда на пхп возникают ошибки и он их выводит вместе с данными картинки, что естественно приводит к херне. Так что проверяйте еще раз свой скрипт просто в браузере, все пути и т.д. Мне кажется у вас $im = ImageCreateFromGif("../image/MM_button_20x150.gif"); тут путевой косяк.
Цитата
2. Сохранять рисунок во временном GIF-е и выводить его с последующим удалением. // Увеличит нагрузку на сервер (Из-за количества обращений чтения/записи на HDD серверной машины)

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

Спустя 22 минуты, 55 секунд (6.03.2008 - 12:15) vasa_c написал(а):
Цитата
Да, выводится абра-кадабра во всех случаях, вместо GIF-а.

То есть хотите сказать, при вставке в страницу тега <IMG> на его месте выводится какой-то текст? Какой браузер?

Спустя 12 минут, 6 секунд (6.03.2008 - 12:27) NuT написал(а):
Видимо я недостаточно точно описал проблему. Итак, фаил btn1.php:
Код
<?
Header("Content-type: image/gif");
$im = ImageCreateFromGif("image/MM_button_20x150.gif");
$LightGrey= ImageColorAllocate($im, 250, 250, 250);
ImageString($im, 3, 3, 1, "Test", $LightGrey);
ImageGif($im);
ImageDestroy($im);
?>
выводит в браузер кнопку с текстом. Фаил btn2.php:
Код
<HTML><HEAD><TITLE></TITLE><BODY>
<?
Header("Content-type: image/gif");
$im = ImageCreateFromGif("image/MM_button_20x150.gif");
$LightGrey= ImageColorAllocate($im, 250, 250, 250);
ImageString($im, 3, 3, 1, "Test", $LightGrey);
ImageGif($im);
ImageDestroy($im);
?>
</BODY></HTML>
Выводит бинарную информацию GIF-а в текстовом виде типа "GIF98#вапЫпцКЙХХхХХХ{{{{}[(К)Пр". ВСЕ пути верные, GIF выводится, НО в текстовом виде, как будто браузер не получает HEADER. В чём загвоздка?

P.S. Internet Explorer 7.0.5730.13.

Спустя 41 минута, 31 секунда (6.03.2008 - 13:09) NuT написал(а):
Для чистоты эксперимента установил Apache/PHP (последние) на локальную машину. Результаты с вышеперечисленными кодами - те же.
Решил "задачу" иначе. Фаил index.php:
Код
<HTML><HEAD><TITLE></TITLE><BODY>
<img src="btn.php?text=test">
</BODY></HTML>
Фаил btn.php:
Код
<?php
Header("Content-type: image/gif");
$string=$_GET['text'];
$im= ImageCreateFromGif("image/MM_button_20x150.gif");
$LightGrey= ImageColorAllocate($im, 250, 250, 250);
ImageString($im, 3, 3, 1, $string, $LightGrey);
ImageGif($im);
ImageDestroy($im);
?>
Ура, товарисчи! Поставленная цель достигнута. Index.php в эксплорере выводит искомую кнопку с динамически генерирующимся текстом. Хто там говорил, что это не возможно?)

P.S. Этот код на моем бесплатном хостинге byethost.com не работает. Index.php снова выводит GIF в текстовом виде. Пришло время платных хостингов =)

Спустя 38 минут, 1 секунда (6.03.2008 - 13:47) vasa_c написал(а):
По первому - http://phpfaq.ru/na_tanke

Спустя 41 минута, 3 секунды (6.03.2008 - 14:28) NuT написал(а):
Для тех кто будет искать такие решения в будущем - случайно наткнулся на метод создания кнопки с надписью через CSS, описанный Timok-ом: http://www.phpforum.ru/index.php?showtopic=3157. ИМХО гораздо удобнее. Сам только начинаю влезать в HTML+PhP+CSS, не судите строго =)

Спустя 1 день, 39 минут, 53 секунды (7.03.2008 - 15:08) sergeiss написал(а):
Я понимаю всё, кроме одного: а почему картинка показывается, хотя в конце кода стоит ImageDestroy(...), применяемая к только что созданному объекту?

Спустя 6 минут, 8 секунд (7.03.2008 - 15:14) lenich написал(а):
Картинка не показывается. Она отсылается ( ImageGif посылает данные на клиент) клиенту по http протоколу и у него показывается. А ImageDestroy очищает ту область памяти на сервере, где эта картинка хранится.

Спустя 26 минут, 20 секунд (7.03.2008 - 15:40) sergeiss написал(а):
Цитата(lenich @ 7.3.2008, 15:14) [snapback]34754[/snapback]
Картинка не показывается. Она отсылается ( ImageGif посылает данные на клиент) клиенту по http протоколу и у него показывается. А ImageDestroy очищает ту область памяти на сервере, где эта картинка хранится.

Я понимаю, что картинка в итоге отсылается клиенту smile.gif
Для меня сей вопрос весьма важен, т.к. с графикой моему серваку предстоит много поработать. И вопрос своевременной очистки всяких буферов на сервере для меня весьма актуален.
Собственно, само формирование картинок (в моем случае графиков на основе данных из БД) у меня нормально получается. И до клиента они доходят. Но, судя по содержанию данной темы, я что-то не до конца понял (наверное).
Как я понимаю, картинка будет отправлена клиенту после выхода из скрипта, создающего эту картинку, но не раньше.
Судя же по написанному в теме коду, картинка должна быть уничтожена сразу же после ее создания, т.е. отправлять уже нечего будет. Вроде бы... Или я что-то не так понимаю?
Поэтому прошу, плз, чуть поподробнее пояснить.

Спустя 4 минуты, 17 секунд (7.03.2008 - 15:45) vasa_c написал(а):
ImageCreateFromGif создает объект в памяти используемым сценарием на сервере.
ImageGif выводит в поток вывода двоичные данные картинки. Именно их и получит браузер и отрисует картинку.
ImageDestroy уничтожит объект и освободит память

Спустя 17 минут, 8 секунд (7.03.2008 - 16:02) sergeiss написал(а):
Сейчас проверил - похоже, так оно и есть smile.gif ImageDestroy вставляю в конце, но картинка все равно показывается.
И любые мои поползновения далее работать в данном скрипте, в т.ч. попытки заново сформировать картинку ничего не меняют. Как одна картинка сформировалась изначально, так я ее и вижу в браузере. Вне зависимости от того, вызывал я ImageDestroy или не делал этого.

А если я не вызову ImageDestroy - то все равно же когда-то будет удален этот временный файл?

Спустя 7 часов, 53 секунды (7.03.2008 - 23:03) lenich написал(а):
Ну вроде как в пхп есть сборщик мусора и он картинку удалит после окончания работы скрипта. Причем картинка хранится я думаю в оперативке, а не во временном файле.

Спустя 11 месяцев, 11 дней, 23 часа, 35 минут, 28 секунд (19.02.2009 - 22:38) Chudik написал(а):
Цитата (vasa_c @ 7.03.2008 - 15:45)
ImageCreateFromGif создает объект в памяти используемым сценарием на сервере.<br />ImageGif выводит в поток вывода двоичные данные картинки. Именно их и получит браузер и отрисует картинку.<br />ImageDestroy уничтожит объект и освободит память

какие именно объекты нужно уничтожать imagedestroy(); только те что создает ImageCreateFromGif или вот $imgs = imagecreatetruecolor($ws, $hs); - $imgs тоже нужно уничтожать?

Спустя 1 час, 12 минут, 52 секунды (19.02.2009 - 23:51) FatCat написал(а):
Цитата (NuT @ 6.03.2008 - 09:55)
Header("Content-type: image/gif");

Цитата (NuT @ 6.03.2008 - 09:55)
Если такой-же скрипт поместить внутри тэгов <BODY> - не работает

Хедер внутрь бодей? Оригинально.
И поток байтного кода вместо файла внутри бодей тоже вызывает сомнения в работоспособности...

Спустя 1 день, 14 часов, 35 минут, 46 секунд (21.02.2009 - 14:27) Mirlen написал(а):
интересно спросить, как написать русскими буквами на картинке....

Спустя 25 минут, 14 секунд (21.02.2009 - 14:52) Guest написал(а):
$text = iconv('windows-1251', 'UTF-8', $text);
наконец-то поиски увенчались успехом и пониманием

Спустя 2 года, 21 день, 43 минуты, 58 секунд (12.03.2011 - 15:36) Анатолий 14 лет написал(а):
Помогите плиз помогите создать кнопку с надписью и выдвижным текстом!!! sad.gif


_____________
С уважением и всё такое.
Быстрый ответ:

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