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


PHP: create image with ImagePng and convert with base64_encode in a single file?

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

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

这行不通。

这在单个 PHP 文件中可能吗?

提前感谢!

这里的诀窍是使用输出缓冲来捕获来自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>';

这是根据imagepng()文档中的用户示例改编的。

在将 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);

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

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

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