PHP中如何将Base64转换为image/png并在浏览器正常显示?
问题:PHP中Base64转PNG并在浏览器显示无输出
我需要用PHP实现将传入的Base64编码转换为image/png并在浏览器显示,现有主代码如下:
<?php require_once 'phpTextToImage.php'; $img = new phpTextToImage; $text = $_GET["text"]; $img->createImage($text); header("Content-Type: image/png"); imagepng($img->image); imagedestroy($img->image); ?>
phpTextToImage.php中的类代码如下:
class phpTextToImage { public $image; function createImage($text) { // 示例Base64编码(已省略部分内容) // "iVBORw0KGgoAAAANSUhEUgAAAFkAAAAcCAYAAAAKnhNwAAAFWElEQVRoge2Zf4hVRRTHPy6PdS01VzaRRUJiyaU2K7NfJkbqH1FiYTbDaqQZSiol6ogFSogVViOkYGm2/fAXzph/qBVpPyApy1ATi6CQEDGJWGpZVl1lWfpjzvXdfd73Y98+XxDvC49z78w9c+Z878yZc+7rp4yiWDjrJwBfy+0obdRvRQ9WZjjrq4GLcjtTG7WjROMqYCkwGrgErE+VYuAKApz1C4ANsaZu4GKF5BLBWV8FrJbbg8Dj2qhWgKr/bFb/P9wMDJXrVyKCoUJyKTEkdn063lEhuXSIc9kd7+gRk5311wBLgCeABlE8CewCrDbqfC4jzvo5wEKgEegEvgFWaqNOJCnICf880AzcJPZ+BjZpo94r1LtccNYPI8TKKYTtfAbYCqwvQPdZ4BlCKOgCTgCbtVFbYs9MBfZkqP7qrIfA2bKq2MPDgaMyodGEF1ANNAGrgMPO+iFkxzqgBRgjukOBqaI3IcGBwcC3wBuiUyO/u4EWZ/32fCTkg7O+XnyaB9TLvEaKP/tz6FU76z8B3gbGEngYDIwHPnTWb4o93gW0AR2xtnZp64SeS7yFsALPApOAAcC1wHzC8m8CXsrh02TgRWCQNqo/cD9wikDcdmd9Tcbzm8WBv4FHgf7AIGC52JshK6kvaAFGEAjQYmMAYec05tBbBzwses0EHq4T/7qBebKC0UZ9qo2qBR6J6d+ljarVRq2EnuFiHIH9pdqor6StE9jorL8HmA08BizOMrGXtVFrohtt1CFnvQYOi6NPAe8AOOubgKgKWqSN2ivX54HXnfWjgDnAXGBjDjKyQmw8JLfLtVFerruBnc76VuDzBL1GwsoHWKyN2inXl4A1zvo7genAImBvpn4SLq9kYb42NmgcR0WOyDHWFdtbG/UDIY5BWK0RmkW2Akn2dklfrvCUD1NFdgLbEvoPZtGbSeClA0g6F/aJHCe5cV4kFiNyANYRtjqk879iipcvCDH+9ljbGJHHtFFdmQraqM+A64uwFccdIo9oo9p7oTdWZAfwmhxgcYwUWUPg6K98A14mzVmfAhYQTtMmSpfe/SFyWKytTuTZEtlIQmSvtzaiuQ0HTJ5nB1IoyULwfmCitLcBvxBOSYAbCGlMMWiLbDnrU0kr9yoh2oW9WcVxnCAcnLnQmqcfSK/kOaQJfgtYFs+JnfXzgE0Uh3qRnTGCWzP6rgYicof3Ui+aW4c2Km8uXQiikPCgyN+1UQsTio6+hI7bRMY/gx4TOUZ2UQ846xuc9aud9Sv6YPekyN7uwOMiG6VY6jOqMuQV8UsMPV3AWNMTdOtJn/IH4l0i64BpCWPNAlYQTvpiERUbNzrrJyf0j8+iF81tKCFtvfIB6wf2ZiIRuYdF3uusnyYDVcvkviNUYZGBbKt6lbN+iWQmUZ66h1AtdRL7zipl9kdyu8FZP0V0aqQAeUH6ig1RAB+T3j3vO+snio2U+LgrSUkbdRyIUoq1zvonoxXtrB/irJ8B/Oisn13oRCLC3iV8OUoBu531F4ELhGS9gZ51ftJbPE0oGtYC55z1F4CfCOlQNzBfG3UqQ2cuIWzUAfvE5jlCKZsCtmij3izUkUxI/J9JSMVGAF/G/NpNeAFHsqjPBQ4RfN0KXHDWnwP+IdQDDcCthc6lSibUDtwHbAH+lL4zhArtFtJbCELOm4lj2qjnSBPXTTh4DgCTtFEfZCpoo9rE5nJCHOwi/VGpWRs1q1AnskEbdYSQL+8gnWqdAl4lnEPfZ9FrBx4gfOw6RHhRKQInXnxaWug8+vXlP74KCkPle3IZUCG5DKiQXAZUSC4DKiSXARWSy4AKyWXAv48vqzlv2H9WAAAAAElFTkSuQmCC"; // 如何在这里输出图片以image/png格式访问? $this->image = base64_to_png($text, "image.png"); return true; } function base64_to_png($base64_string, $output_file) { $ifp = fopen( $output_file, 'wb' ); $data = explode( ',', $base64_string ); fwrite( $ifp, base64_decode( $data[ 1 ] ) ); fclose( $ifp ); return $output_file; } }
我期望通过?text={{base64encoded}}的方式传入Base64编码调用,但目前浏览器无内容输出,已尝试相关方案但无效,请问该如何解决?
解决方案
核心问题是混淆了文件路径和GD图像资源:
base64_to_png函数返回的是本地文件路径(字符串),但主代码用imagepng()输出这个字符串,而imagepng()需要的是GD创建的图像资源,这直接导致输出失败。- 额外的本地文件写入完全没必要,可直接解码Base64内容输出到浏览器。
方案1:直接输出Base64解码内容(推荐)
无需依赖GD库,直接输出二进制数据:
修改主代码
<?php require_once 'phpTextToImage.php'; $img = new phpTextToImage; $text = $_GET["text"]; $img->outputImage($text); ?>
修改phpTextToImage.php类
class phpTextToImage { function outputImage($text) { // 分离Base64前缀与编码内容 $data = explode(',', $text); if(count($data) < 2) { header("HTTP/1.1 400 Bad Request"); exit("无效的Base64数据"); } // 设置响应头 header("Content-Type: image/png"); header("Content-Length: " . strlen(base64_decode($data[1]))); // 输出解码后的二进制内容 echo base64_decode($data[1]); exit; } }
方案2:使用GD库(需后续图像处理时用)
如果需要裁剪、加水印等操作,可通过GD加载图片:
修改phpTextToImage.php的createImage方法
function createImage($text) { $data = explode(',', $text); if(count($data) < 2) { return false; } // 解码Base64为二进制字符串 $imageData = base64_decode($data[1]); // 用GD加载二进制数据 $this->image = imagecreatefromstring($imageData); return $this->image !== false; }
主代码增加错误判断
<?php require_once 'phpTextToImage.php'; $img = new phpTextToImage; $text = $_GET["text"]; if(!$img->createImage($text)) { header("HTTP/1.1 400 Bad Request"); exit("图片加载失败"); } header("Content-Type: image/png"); imagepng($img->image); imagedestroy($img->image); ?>
额外注意事项
- 传入的Base64需是URL安全的:若原编码含
+、/、=,需先做URL编码,或在PHP中用urldecode($_GET["text"])处理。 - 确保PHP内存足够处理图片,且
allow_url_fopen开启(方案2需要)。 - 输出图片前不能有任何echo、空格或HTML内容,否则会破坏响应头,导致浏览器无法识别图片。
内容的提问来源于stack exchange,提问作者kunass2
相关产品推荐
相关产品推荐

