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

862次阅读
没有评论

大家可能注意到了,网页上有些图片的 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。

正文完
有偿技术支持加微信
post-qrcode
 
评论(没有评论)
验证码