Рендеринг изображения с php вывод его с тегом html



У меня есть класс с несколькими функциями, которые могут отображать изображения.



// render.php
class Render {
public function Render($some_arguments) {
...
header("Content-Type: image/png");
$im = @imagecreate(110, 20)
or die("Cannot Initialize new GD image stream");
$background_color = imagecolorallocate($im, 0, 0, 0);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, "A Simple Text String", $text_color);
imagepng($im);
return "data:image/png;base64,".base64_encode($im);
}
}


Затем у меня есть мой php-файл, который содержит html-код и где я хотел бы вывести изображение в теге < img>:



// index.php
include("render.php");
$render = new Render();
echo "<htlm><head></head><body>";
echo "<img src="".$render->Render(1)."" />";
echo "</body></html>";


Когда я запускаю индекс.php в моем браузере я просто получаю пустой экран.



Не могу ли я использовать вызов функции в качестве источника изображения? Я знаю, что могу использовать php-файл в качестве источника, например < img src="render_image.php" />, но тогда я не могу отправлять аргументы объектно-ориентированным способом (я знаю, что могу использовать $_GET для получить аргументы), но я хотел бы сделать это с хорошим объектно-ориентированным написанным кодом.



Итак, есть ли способ использовать вызов функции в качестве источника HTML-тега?

801   4  

4 ответов:

Вам придется разделить его:

Render(...) напишет временный файл (с рандомизированным именем), который будет доступен из интернета в течение некоторого времени.

Новый метод Output() вернет рандомизированное имя, упомянутое выше.

Затем вы вызываете Render() перед выводом HTML и вставляете URL-адрес с помощью Output().

В качестве альтернативы, вы можете использовать какой-то файл или базу данных для обмена параметрами, по существу, какой-то метод Prepare(...)? запись параметров в файл или базу данных и Render() читать эти и снова, размещения файлов и т. д.

В качестве еще одной альтернативы (без записи в файловую систему): вы можете реализовать включение данных изображения с помощью uri data:, но размер изображения будет ограничен в зависимости от используемого браузера, и вы не можете кэшировать данные таким образом (т. е. вы должны отправлять их все время).

В зависимости от того, чего вы пытаетесь достичь, вам также может повезти с внедрением образа SVG. Это дало бы огромное преимущество быть на месте. при этом используя меньше пропускная способность, масштабируемость и т. д. Недостатком является то, что это поддерживается только в новейших браузерах (подобно data:), но нет ограничений по размеру.


Edit: используя base64 / embedded подход, он становится немного сложнее, что приводит к чему-то вроде этого (непроверено, но должно работать):

ob_start(); // buffers future output
imagepng($img); // writes to output/buffer
$b64 = base64_encode(ob_get_contents()); // returns output
ob_end_clean(); // clears buffered output

Вы можете BASE64 кодировать изображение и использовать схему url-адреса данных:

data:[<MIME-type>][;charset=<encoding>][;base64],<data>

Напр.

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot">

Итак, если вы включаете это вместо необработанного изображения, вы можете делать именно то, что хотите.

(Примеры из Википедии )

Наиболее вероятная причина появления пустого экрана связана с отправкой двух наборов данных заголовка. Итак, во-первых, вы запускаете это утверждение:

echo "<htlm><head></head><body>";

, который автоматически устанавливает тип содержимого данных, отправляемых в браузер. Далее вы запускаете следующую строку:

echo "<img src=\"".$render->Render(1)."\" />"; 

Который затем вызывает выполнение этой строки:

header("Content-type: image/png");

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

Рекомендую чанинг функции Render () скорее принять имя файла, а затем записать изображение в этот файл и вернуть путь, указывающий на файл изображения, который был записан. Таким образом, вы не пытаетесь вывести файл изображения и html-файл в одном потоке в браузер.

С уважением, Ральф

У меня была примерно такая же проблема некоторое время назад. Вы можете найти решение и некоторые возможные проблемы этого здесь: встроенные генерируемые изображения, превышающие длину

Основной Я думаю, что вы ищете это <img src="data:image/png;base64,[data in base64]"/>

Comments

    Ничего не найдено.