利用PHP将图片转换成base64编码的实现方法

时间:2023-12-30 13:25:56

先来说一下为什么我们要对图片base64编码

base64是当前网络上最为常见的传输8Bit字节代码的编码方式其中之一。base64主要不是加密,它主要的用途是把某些二进制数转成普通字符用于网络传输。由于这些二进制字符在传输协议中属于控制字符,不能直接传送,所以需要转换一下。虽然图片可能直接传输,但是我们也可以将它变成字符串直接放在源码里,而不需要浏览器在读取到源码后再从服务器上下载。

如何使用PHP对图片进行base64解码输出

<?php
$img = 'test.png';
$base64_img = base64EncodeImage($img); echo '<img src="'.$base64_img.'"/>'; function base64EncodeImage ($image_file) {
$base64_image = '';
$image_info = getimagesize($image_file);
$image_data = fread(fopen($image_file, 'r'), filesize($image_file));
$base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));
return $base64_image;
}
?>

------

PHP对Base64的支持非常好,有内置的base64_encode与base64_decode负责图片的Base64编码与解码。

编码上,只要将图片流读取到,而后使用base64_encode进行进行编码即可得到。

/**
* 获取图片的Base64编码(不支持url)
* @date 2017-02-20 19:41:22
*
* @param $img_file 传入本地图片地址
*
* @return string
*/
function imgToBase64($img_file) { $img_base64 = '';
if (file_exists($img_file)) {
$app_img_file = $img_file; // 图片路径
$img_info = getimagesize($app_img_file); // 取得图片的大小,类型等 //echo '<pre>' . print_r($img_info, true) . '</pre><br>';
$fp = fopen($app_img_file, "r"); // 图片是否可读权限 if ($fp) {
$filesize = filesize($app_img_file);
$content = fread($fp, $filesize);
$file_content = chunk_split(base64_encode($content)); // base64编码
switch ($img_info[2]) { //判读图片类型
case 1: $img_type = "gif";
break;
case 2: $img_type = "jpg";
break;
case 3: $img_type = "png";
break;
} $img_base64 = 'data:image/' . $img_type . ';base64,' . $file_content;//合成图片的base64编码 }
fclose($fp);
} return $img_base64; //返回图片的base64
} //调用使用的方法
$img_dir = dirname(__FILE__) . '/uploads/img/11213223.jpg';
$img_base64 = imgToBase64($img_dir);
echo '<img src="' . $img_base64 . '">'; //图片形式展示
echo '<hr>';
echo $img_base64; //输出Base64编码

而解码就略微麻烦一点,究其原因在于把图片编码成base64字符串后,编码内会加入这些字符 data:image/png;base64,本来是用于base64进行识别的。但是如果直接放到php里用base64_decode函数解码会导致最终保存的图片文件格式损坏,而解决方法就是先去掉这一串字符:

$base64_string= explode(',', $base64_string); //截取data:image/png;base64, 这个逗号后的字符
$data= base64_decode($base64_string[1]);  //对截取后的字符使用base64_decode进行解码
file_put_contents($url, $data); //写入文件并保存

而网络远程图片地址转base64,可以用

//网络远程图片地址转base64

$img_u = 'https://common.cnblogs.com/images/wechat.png'; 

$imageInfo = getimagesize($img_u);

$b64 = base64_encode(file_get_contents($img_u));  

echo '<br>';

var_dump($imageInfo);

echo '<br><pre>';

var_dump($b64);

转:

https://www.cnblogs.com/lixihuan/p/7843980.html

https://www.cnblogs.com/cloudshadow/p/php_img_to_base64.html

https://www.cnblogs.com/byuc/p/7600451.html