PHP:使用ImagePng创建图像并在单个文件中使用base64_encode进行转换?

时间:2012-02-21 01:18:46

标签: php image gd

我用ImagePng()创建了一个图像。我不希望它将图像保存到文件系统,但想要在与base64编码内联图像相同的页面上输出它,如

print '<p><img src="data:image/png;base64,'.base64_encode(ImagePng($png)).'" alt="image 1" width="96" height="48"/></p>';

哪个不起作用。

这在一个PHP文件中是否可行?

提前致谢!

3 个答案:

答案 0 :(得分:29)

这里的技巧是使用输出缓冲来捕获imagepng()的输出,该输出将输出发送到浏览器或文件。它不会将其返回存储在变量(或base64编码)中:

// Enable output buffering
ob_start();
imagepng($png);
// Capture the output and clear the output buffer
$imagedata = ob_get_clean();

print '<p><img src="data:image/png;base64,'.base64_encode($imagedata).'" alt="image 1" width="96" height="48"/></p>';

这是根据the imagepng() docs.

中的用户示例改编的

答案 1 :(得分:5)

在将PHP与AJAX结合使用时,我无法使用ob_get_contents(),所以我尝试了这个:

$id = generateID(); //Whereas this generates a random ID number
$file="testimage".$id.".png";
imagepng($image, $file);
imagedestroy($image);
echo(base64_encode(file_get_contents($file)));
unlink($file);

这会在服务器上保存一个临时图像文件,然后在编码和回显后将其删除。

答案 2 :(得分:0)

如果您不希望存储到显式文件,并且您已经将ob_start()用于其他内容(因此在没有大量重构的情况下不能使用ob_start),您可以定义自己的流将流输出存储到变量的包装器。

使用stream_wrapper_register注册新的流包装器,并实现其stream_write方法将其写入变量,该变量的值可以在以后检索。然后,您将此流(实际上只需要将此流的URI传递)传递给imagepng。想要关闭你的流的imagepng不会打扰你,只要你的流包装器在关闭时不会销毁数据(stream_close方法被调用)。