我用ImagePng()创建了一个图像。我不希望它将图像保存到文件系统,但想要在与base64编码内联图像相同的页面上输出它,如
print '<p><img src="data:image/png;base64,'.base64_encode(ImagePng($png)).'" alt="image 1" width="96" height="48"/></p>';
哪个不起作用。
这在一个PHP文件中是否可行?
提前致谢!
答案 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>';
中的用户示例改编的
答案 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
方法被调用)。