data:image/png;base64 利用base64对图片进行编码及解码

作者: JONE 分类: PHP/MySQL 发布时间: 2017-11-26 18:35

大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJAQMAAADaX5RTAAAAA3NCSVQICAjb4U/gAAAABlBMVEX///+ZmZmOUEqyAAAAAnRSTlMA/1uRIrUAAAAJcEhZcwAACusAAArrAYKLDVoAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDkvMjAvMTIGkKG+AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAAB1JREFUCJljONjA8LiBoZyBwY6BQQZMAtlAkYMNAF1fBs/zPvcnAAAAAElFTkSuQmCC
那么这是什么呢?这是Data URI scheme。
Data URI scheme是在RFC2397中定义的,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入。比如上面那串字符,其实是一张小图片,将这些字符复制黏贴到火狐的地址栏中并转到,就能看到它了,一张1X36的白灰png图片。
在上面的Data URI中,data表示取得数据的协定名称,image/png 是数据类型名称,base64 是数据的编码方法,逗号后面就是这个image/png文件base64编码后的数据。
目前,Data URI scheme支持的类型有:
data:,文本数据
data:text/plain,文本数据
data:text/html,HTML代码
data:text/html;base64,base64编码的HTML代码
data:text/css,CSS代码
data:text/css;base64,base64编码的CSS代码
data:text/javascript,Javascript代码
data:text/javascript;base64,base64编码的Javascript代码
data:image/gif;base64,base64编码的gif图片数据
data:image/png;base64,base64编码的png图片数据
data:image/jpeg;base64,base64编码的jpeg图片数据
data:image/x-icon;base64,base64编码的icon图片数据
base64简单地说,它把一些 8-bit 数据翻译成标准 ASCII 字符,网上有很多免费的base64 编码和解码的工具,在PHP中可以用函数base64_encode() 进行编码,如echo base64_encode(file_get_contents(‘wg.png’));
目前,IE8、Firfox、Chrome、Opera浏览器都支持这种小文件嵌入。
举个图片的例子:
网页中一张图片可以这样显示:
<img src="http://mail.163.com/images/x.png" />

 

也可以这样显示:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJAQMAAADaX5RTAAAAA3NCSVQICAjb4U/gAAAABlBMVEX///+ZmZmOUEqyAAAAAnRSTlMA/1uRIrUAAAAJcEhZcwAACusAAArrAYKLDVoAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDkvMjAvMTIGkKG+AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAAB1JREFUCJljONjA8LiBoZyBwY6BQQZMAtlAkYMNAF1fBs/zPvcnAAAAAElFTkSuQmCC" />

把图像文件的内容直接写在了HTML 文件中,这样做的好处是,节省了一个HTTP 请求。坏处是浏览器不会缓存这种图像。


试图将图片通过json进行传输,这个时候就想到利用base64编码的方法来图片。主要步骤有
1、对图片文件进行编码,转换为base64编码的格式,及一长串字符;
2、可将字符通过json进行传送;
3、目的方接收json数组,取出编码字符串,并进行解码,显示图片
该方法难点主要还是在于对图片的编解码处理,以下是用PHP实现的编解码处理代码

 

<?php  
        $image_file = './uploads/14391214729290.jpg';  
  
        //读取图片文件,并转换成base64编码格式  

        $image_info = getimagesize($image_file);  
        $base64_image_content = "data:{$image_info['mime']};base64," . chunk_split(base64_encode(file_get_contents($image_file)));  
        //echo $base64_image_content;  
        //将base64字符串解码并保存为原来图片格式  
        if (preg_match('/^(data:\s*image\/(\w+);base64,)/'$base64_image_content$result)){  

            $type = $result[2];  

            $new_file = "./newfile.{$type}";  

            if (file_put_contents($new_filebase64_decode(str_replace($result[1], ''$base64_image_content)))){  

                echo '新文件保存成功:'$new_file;  
            }  
          }  

        //显示图片  
        <img src="<?php echo $base64_image_content;?>" />  
 ?>

 

其中,
preg_match()
作用:执行一个正则表达式匹配
返回值:返回 pattern 的匹配次数。 它的值将是0次(不匹配)或1次,因为preg_match()在第一次匹配后 将会停止搜索。如果发生错误preg_match()返回 FALSE。
file_put_contents ()
作用:将一个字符串写入文件
返回值:该函数成功将返回写入到文件内数据的字节数,失败时返回 FALSE。

6条评论
  • 懿古今

    2017年11月30日 下午2:06

    这个加密图片我也见过几次,不过我们个人博客网站一般好像还真没必要用到这个

    1. JONE

      2017年11月30日 下午6:51

      不是加密,不是加密,自行百科吧,我也是意外发现的

  • 钟水洲博客

    2017年11月30日 下午4:46

    图片还要加密,厉害了

    1. JONE

      2017年11月30日 下午6:49

      是转码不是加密,把二进制文件转码成字符节信息

  • 龙笑天

    2017年12月2日 上午11:14

    图片都转成这样的话,对浏览器消耗应该很大吧~

    1. JONE

      2017年12月2日 下午1:28

      比如这个应用场景,试图将图片通过json进行传输,就可以先把图片转码成字符串,然后再服务器端再解码成图片,然后给浏览器访问就好了,对浏览器也不会有啥性能影响啊

发表评论

电子邮件地址不会被公开。 必填项已用*标注