使用php渲染图像并使用html <img/>标记输出它

时间:2012-01-21 11:22:37

标签: php html image render

我有一个包含几个可以渲染图像的函数的类。

// 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标签的来源?

4 个答案:

答案 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]"/>