我有一个包含几个可以渲染图像的函数的类。
// 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>";
当我在浏览器中运行index.php时,我只得到一个空白屏幕。
我不能将函数调用用作图像源吗?我知道我可以使用php文件作为源代码,比如< img src="render_image.php" />
,但是我不能以面向对象的方式发送任何参数(我知道我可以使用$ _GET来检索参数),但我想这样做用一个很好的面向对象的代码编写。
那么,有没有办法使用函数调用作为html标签的来源?
答案 0 :(得分:4)
您可以对图像进行BASE64编码并使用数据网址方案:
data:[<MIME-type>][;charset=<encoding>][;base64],<data>
例如
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot">
因此,如果你包含它而不是原始图像,你可以完全按照你想要的那样做。
(来自Wikipediea的例子)
答案 1 :(得分:3)
你必须分开它:
Render(...)
将写一个临时文件(带有随机名称),可以在网上访问一段时间。
新方法Output()
将返回上述随机名称。
然后,在输出HTML并使用Render()
嵌入网址之前,请先致电Output()
。
作为替代方案,你可以使用一些文件或数据库来交换参数,基本上是一些方法Prepare(...)
?将params写入文件或数据库,并Render()
读取这些并再次放置文件等。
作为另一种选择(无需写入文件系统):您可以使用data:
uri实现包含图像数据,但图像大小将受到限制,具体取决于所使用的浏览器,您无法缓存这种方式的数据(即你必须一直发送)。
根据您要实现的目标,您可能也很幸运地嵌入了SVG图像。这将提供就地的巨大优势,同时仍然使用更少的带宽,可扩展等。下行是,这仅在最新的浏览器中支持(类似于data:
)但没有大小限制。
编辑:使用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
答案 2 :(得分:2)
空白屏幕最可能的原因与提交的两组标题数据有关。所以,首先你要运行这个声明:
echo "<htlm><head></head><body>";
这将自动设置发送到浏览器的数据的内容类型。 接下来,您正在运行此行:
echo "<img src=\"".$render->Render(1)."\" />";
然后导致此行运行:
header("Content-type: image/png");
然后尝试将不同的标头设置为第一个echo语句已发送的标头。
我建议使用Render()函数来接受文件名,然后将图像写入该文件并返回指向写入的图像文件的路径。这样,您就不会尝试将同一流中的图像文件和html文件输出到浏览器。
此致 拉尔夫
答案 3 :(得分:1)
前一段时间我的问题几乎相同。您可以在此处找到解决方案及其可能存在的问题:Inline generated images exceeding length
我认为你要找的基本是<img src="data:image/png;base64,[data in base64]"/>