PHP中data/base64数据流转图片文件输出例子

我们来看看data/base64是什么吧

什么是data:image/*;base64?

答:这是Data URI scheme。
还不懂?
Ps:Data URI scheme是在RFC2397中定义的,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入。
例如:
data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhJREFUeNo8zjsOxCAMBFB/ KEAUFFR0Cbng3nQPw68ArZdAlOZppPFIBhH5EAB8b+Tlt9MYQ6i1BuqFaq1CKSVcxZ2Acs6406KUgpt5/ LCKuVgz5BDCSb13ZO99ZOdcZGvt4mJjzMVKqcha68iIePB86GAiOv8CDADlIUQBs7MD3wAAAABJRU5ErkJggg%3D%3D。
将这些字符复制黏贴到火狐的地址栏中并转到,就能看到它了,一张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('emtalk.png'));

目前,IE8、Firfox、Chrome、Opera浏览器都支持这种小文件嵌入。

写个简单的小函数:

<?php
header('Content-type:text/html;charset=utf-8');
function image_base64($image_file){
 if(empty($image_file))return false;
 $image_info = getimagesize($image_file);
 $base64_image_content = "data:{$image_info['mime']};base64," . chunk_split(base64_encode(file_get_contents($image_file)));
 return $base64_image_content;
}
?>
<html> 
<head>
<title>逐风博客-图片编码输出测试</title>
</head> 
<body> 
<img id="img1" width='100' src="<?php echo image_base64('imgtest.jpg');?>"/> 
</body> 
</html>

并且掌握了PHP生成代码,那么今天逐风君再给小伙伴们带来一个,把data:image/;base64数据流转化回图片文件的处理方法(函数):

/**
 * 反编译data/base64数据流并创建图片文件
 * @author Lonny ciwdream@gmail.com
 * @param string $baseData  data/base64数据流
 * @param string $Dir           存放图片文件目录
 * @param string $fileName   图片文件名称(不含文件后缀)
 * @return mixed 返回新创建文件路径或布尔类型
 */
function base64DecImg($baseData, $Dir, $fileName){
    // 前台访问URL API
    $__URL__= 'http://emtalk.net/';
    // 服务器根目录绝对路径获取API
    $__root__=isset($_SERVER['DOCUMENT_ROOT'])?$_SERVER['DOCUMENT_ROOT']:(isset($_SERVER['APPL_PHYSICAL_PATH'])?trim($_SERVER['APPL_PHYSICAL_PATH'],"\\"):(isset($_['PATH_TRANSLATED'])?str_replace($_SERVER["PHP_SELF"]):str_replace(str_replace("/","\\",isset($_SERVER["PHP_SELF"])?$_SERVER["PHP_SELF"]:(isset($_SERVER["URL"])?$_SERVER["URL"]:$_SERVER["SCRIPT_NAME"])),"",isset($_SERVER["PATH_TRANSLATED"])?$_SERVER["PATH_TRANSLATED"]:$_SERVER["SCRIPT_FILENAME"])));
    // 上诉两个变量,依据实际情况自行修改
    try{
        $expData = explode(';',$baseData);
        $postfix   = explode('/',$expData[0]);
        if( strstr($postfix[0],'image') ){
            $postfix   = $postfix[1] == 'jpeg' ? 'jpg' : $postfix[1];
            $storageDir = $Dir.DIRECTORY_SEPARATOR.$fileName.'.'.$postfix;
            $export = base64_decode(str_replace("{$expData[0]};base64,", '', $baseData));
            $returnDir = str_replace(str_replace('/','\\',$__root__),'',$storageDir);
            try{
                file_put_contents($storageDir, $export);
                return $__URL__.$returnDir;
            }catch(Exception $e){
                return false;
            }
        }
    }catch(Exception $e){
        return false;
    }
    return false;
}

代码看懂没?这只是个简单的小示例,通过代码优化、调整这个函数还可以实现data:image/;base64数据不同数据类型文件的还原呦!

时间: 2024-09-19 08:54:58

PHP中data/base64数据流转图片文件输出例子的相关文章

java中getBytes方法可能使图片文件产生的问题

InputStream is = new FileInputStream(fl); ImageInputStream iis = ImageIO.createImageInputStream(is); Iterator<ImageReader> itImage = ImageIO.getImageReaders(iis); if(itImage.hasNext()){ ImageReader reader = itImage.next(); byte[] imageByte = new byt

Android中Movie导入播放GIF图片文件异常IOException.reset

使用Movie播放GIF图片时,能正常导入assets中的gif文件,如:  代码如下 复制代码 is=context.getResources().openRawResource(R.drawable.mygif); movie = Movie.decodeStream(is); 然而把网络图片加载到本地后,却报以下错误:  代码如下 复制代码 java.io.IOException at java.io.InputStream.reset(InputStream.java:218) at a

linux中sed批量更改多个文件内容例子

需要修改多个文件的内容,一个一个的替换比较繁琐.那么有没有什么好的方法直接多多个文件进行批量修改呢?方法如下: 1. sed grep old_string -rl ./* | xargs sed -i "s/old_string/new_string/g" sed -i "s/old_string/new_string/g" `grep old_string -rl ./*` 如: sed -i "s/11/xxx/g" `grep 11 -r

dedecms列中调用单条数据文章body的内容例子

其实多数情况下我们会使用description来调用文章的内容.但是discription会有字符数字限制,并且修改文章的时候还要一起修改文章的描述内容,才能在调用的时候正常显示. 因此我们需要直接调用body字段的内容,但是dede默认情况下无法直接调用body字段,所以我们需要使用addfields 和 channelid的属性来激活body的调用.这点与自定义字段在文章里表中的调用应用相似. 那么我们可以通过下面的代码进行调用: {dede:arclist row='1′ addfield

图片-WebUploader中的uploadSuccess是自动调用的吗?怎么获取服务器中返回的数据?

问题描述 WebUploader中的uploadSuccess是自动调用的吗?怎么获取服务器中返回的数据? 5C WebUploader中的uploadSuccess是自动调用的吗?怎么获取服务器中返回的数据?我图片上传成功服务器也收到图片了,但是返回的数据前台接收不到,也没有执行uploadSuccess方法,这是怎么回事?各位大神,求助! 解决方案 http://fex.baidu.com/webuploader/doc/index.html#WebUploader_Uploader_eve

浅析用Base64编码的图片优化网页加载速度

  想必大家都知道网页加载的过程,从开始请求,到加载页面,开始解析和显示网页,遇到图片就再次向服务器发送请求,加载图片.如果图片很多的话,就会产生大量的http请求,从而影响页面的加载速度.所以现在有一种做法是将多张图片合并到一起,这样在打开页面的时候只需要一次http请求就可以加载多张图片,然后通过设置图片的背景偏移量来正确的显示.现在我们可以将图片转成base64编码,然后直接写在html页面或者css里面,这样在加载页面或者css的时候就可以直接将图片加载过去,这样也省去了设置图片背景偏移

webuploader-WebUploader中的uploadSuccess是自动调用的吗?怎么获取服务器中返回的数据?

问题描述 WebUploader中的uploadSuccess是自动调用的吗?怎么获取服务器中返回的数据? WebUploader中的uploadSuccess是自动调用的吗?怎么获取服务器中返回的数据? 我图片上传成功服务器也收到图片了,但是返回的数据前台接收不到,也没有执行uploadSuccess方法,这是怎么回事?各位大神,求助! 解决方案 服务器会返回success(200)状态码,表示成功.你也可以自己处理onsuccess,把你的接收的代码写进去. 返回的数据前台接收不到 你要注意

多线程-Java中处理大数据的问题

问题描述 Java中处理大数据的问题 在做一个信息提取的项目,需要提取几万份文件中的特定数据(每份文件大概是两百页左右的PDF),现在已经可以提取出其中一份文件中的特定数据了.问:现在要怎样提取几万份文件中的特定数据?用的是Java,据说要用多线程,不知道是不是,如果是的话,具体要怎么用? 解决方案 开线程可能会造成内存溢出的问题,这样的任务应该交给多台服务器多个线程来处理,这样又快又安全. 解决方案二: java 大数据处理java大数据处理java 大数据处理

关于Adodb.Stream的写数据库数据到客户端文件的实践

ado|stream|客户端|数据|数据库 这是一个从服务器数据库直接下数据到客户端文件的例子,文件名和扩展名可以根据需要随便写.new/temp.htm要求真实存在,其实没有什么作用,只是引导一下,否则不能对stram数据进行写操作.网络上流传的这方面的东西不少,但多数是copy来的,很简单的事情搞得那么复杂.真正经过实践的东东少得可怜.于是自己写了一个,虽然简单,也有些问题,但是copy下去就可以用了.有问题的朋友可以跟我联系,好一起学习. filemystream=server.mappa