Рендеринг изображения с 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-тега?
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