!
也想出现在这里? 联系我们
广告位

PHP 实现图片 Base64 编码与解码

我们在传输和处理图片时,Base64 是一个常用的选择,PHP 中就有函数(base64_encode 和 base64_decode)分别负责图片 Base64 编码和图片 Base64 解码,老王昨天在网上找到 2 段关于图片 Base64 编码和解码的 PHP 代码实现,用起来还不错,这里与大家做个分享。

一、PHP 实现图片 Base64 编码

实现思路主要就是先将图片流读取到 -> 使用 base64_encode() 进行进行编码 -> 拼接上前缀(data:image/png;base64,)

  1. /**
  2. * 图片base64编码
  3. * @param string $img
  4. * @param bool $imgHtmlCode
  5. * author 江南极客
  6. * @return string
  7. */
  8. function imgBase64Encode($img = '', $imgHtmlCode = true)
  9. {
  10. //如果是本地文件
  11. if(strpos($img,'http') === false && !file_exists($img)){
  12. return $img;
  13. }
  14. //获取文件内容
  15. $file_content = file_get_contents($img);
  16. if($file_content === false){
  17. return $img;
  18. }
  19. $imageInfo = getimagesize($img);
  20. $prefiex = '';
  21. if($imgHtmlCode){
  22. $prefiex = 'data:' . $imageInfo['mime'] . ';base64,';
  23. }
  24. $base64 = $prefiex.chunk_split(base64_encode($file_content));
  25. return $base64;
  26. }

二、PHP 实现图片 Base64 解码

相比于编码来说,解码稍微复杂一点,因为在对图片进行 Base64 编码的时候会加入前缀字符串(data:image/png;base64,) ,解码之前需要先去掉这一串字符,PHP 代码实现如下:

  1. /**
  2. * 片base64解码
  3. * @param string $base64_image_content 图片文件流
  4. * @param bool $save_img 是否保存图片
  5. * @param string $path 文件保存路径
  6. * author 江南极客
  7. * @return bool|string
  8. */
  9. function imgBase64Decode($base64_image_content = '',$save_img = false,$path=''){
  10. if(empty($base64_image_content)){
  11. return false;
  12. }
  13. //匹配出图片的信息
  14. $match = preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result);
  15. if(!$match){
  16. return false;
  17. }
  18. //解码图片内容(方法一)
  19. /*$base64_image = preg_split("/(,|;)/",$base64_image_content);
  20. $file_content = base64_decode($base64_image[2]);
  21. $file_type = substr(strrchr($base64_image[0],'/'),1);*/
  22. //解码图片内容(方法二)
  23. $base64_image = str_replace($result[1], '', $base64_image_content);
  24. $file_content = base64_decode($base64_image);
  25. $file_type = $result[2];
  26. //如果不保存文件,直接返回图片内容
  27. if(!$save_img){
  28. return $file_content;
  29. }
  30. //如果没指定目录,则保存在当前目录下
  31. if(empty($path)){
  32. $path = __DIR__;
  33. }
  34. $file_path = $path."/".date('Ymd',time())."/";
  35. if(!is_dir($file_path)){
  36. //检查是否有该文件夹,如果没有就创建
  37. mkdir($file_path,0777,true);
  38. }
  39. $file_name = time().".{$file_type}";
  40. $new_file = $file_path.$file_name;
  41. if(file_exists($new_file)){
  42. //有同名文件删除
  43. @unlink($new_file);
  44. }
  45. if (file_put_contents($new_file, $file_content)){
  46. return $new_file;
  47. }
  48. return false;
  49. }

三、在使用 Base64 编码时需要注意的问题

老王昨天在写好服务器端代码后,用在线图片转 Base64 编码工具将一张图片装成了 Base64 编码,再使用在线 Post 进行测试服务器代码时,发现服务器解码得到的图片都是已损坏,无法打开的。后来发现是因为在使用 ajax 传 Base64 编码时,因为 Base64 字符串中有特殊字符,会被转义,所以传到服务器的字符串跟实际的字符串其实不一样,这就导致了 Base64 解码的图片无法打开的问题,后来老王用 Python 写了段测试脚本就没有这个问题了。

如果你也遇到了这个问题,那么老王分享几个网站的解决方案:

1、使用 str.replace(/\&/g,"%26");str.replace(/\+/g,"%2B"); 把字符串中的‘&’、+ 转义

2 、把 base64 图片字符串通过 encodeURIComponent(dataurl) 加密

3、数据格式可以用对象形式传送

给TA打赏
共{{data.count}}人
人已打赏
前端学习

代码实现给网站添加返回顶部功能

2024-8-30 14:17:14

前端学习

CSS实现边框透明的方法

2024-8-30 14:17:20

下载说明

  • 1、微码盒所提供的压缩包若无特别说明,解压密码均为weimahe.com
  • 2、下载后文件若为压缩包格式,请安装7Z软件或者其它压缩软件进行解压;
  • 3、文件比较大的时候,建议使用下载工具进行下载,浏览器下载有时候会自动中断,导致下载错误;
  • 4、资源可能会由于内容问题被和谐,导致下载链接不可用,遇到此问题,请到文章页面进行反馈,以便微码盒及时进行更新;
  • 5、其他下载问题请自行搜索教程,这里不一一讲解。

站长声明

本站大部分下载资源收集于网络,只做学习和交流使用,版权归原作者所有;若为付费资源,请在下载后24小时之内自觉删除;若作商业用途,请到原网站购买;由于未及时购买和付费发生的侵权行为,与本站无关。本站发布的内容若侵犯到您的权益,请联系本站删除,我们将及时处理!
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索