设为首页收藏本站

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 790|回复: 2

PHP读取图片并显示在浏览器中的两种方法

[复制链接]
发表于 2013-11-1 14:57:06 | 显示全部楼层 |阅读模式
    在PHP对图形图片的操作中,有时候需要有读取图片,并且还要显示在浏览器上,下面将介绍一下PHP读取图片并且将图片显示在浏览器的两种方法。
  1. <?php
  2. $imgurl = "test.gif";
  3. $image = fread(fopen($imgurl,r),filesize($imgurl));
  4. header("Content-type: image/gif",true);
  5. echo $image;
  6. ?>
复制代码

    第一种方法:这种方法很简单,但是这段代码如果不放在页面的开头,会报错的,如果要读取JPEG类型的图片,只要将header("Content-type: image/gif",true)改成header("Content-type: image/JPEG",true)就可以了。
    第二种方法:这种方法是以写好封装类的方法处理的,这种方法灵活,随意读取各类类型的图片都可以,并且稳定得多,个人推荐这种方法。

  1. <?php
  2. //图片路径
  3. $imgurl="test.jpg";
  4. //图片信息读取方法
  5. class imgdata{  
  6.     public $imgsrc;  
  7.     public $imgdata;  
  8.     public $imgform;  
  9.     public function getdir($source){  
  10.         $this->imgsrc  = $source;  
  11.     }  
  12.     public function img2data(){  
  13.         $this->_imgfrom($this->imgsrc);  
  14.         return $this->imgdata=fread(fopen($this->imgsrc,'rb'),filesize($this->imgsrc));         
  15.     }  
  16.     public function data2img(){  
  17.         header("content-type:$this->imgform");  
  18.         echo $this->imgdata;  
  19.     }  
  20.     public function _imgfrom($imgsrc){  
  21.         $info=getimagesize($imgsrc);  
  22.         return $this->imgform = $info['mime'];  
  23.     }   
  24. }  
  25. $n=new imgdata;  
  26. $n->getdir($imgurl);
  27. $n->img2data();
  28. $n->data2img();
  29. ?>
复制代码

 楼主| 发表于 2013-11-1 15:07:14 | 显示全部楼层
一个利用php获取远程图片并将远程图片下载保存到本地的函数代码:
  1. /*
  2. *功能:php完美实现下载远程图片保存到本地
  3. *参数:文件url,保存文件目录,保存文件名称,使用的下载方式
  4. *当保存文件名称为空时则使用远程文件原来的名称
  5. */
  6. function getImage($url,$save_dir='',$filename='',$type=0){
  7.     if(trim($url)==''){
  8.                 return array('file_name'=>'','save_path'=>'','error'=>1);
  9.         }
  10.         if(trim($save_dir)==''){
  11.                 $save_dir='./';
  12.         }
  13.     if(trim($filename)==''){//保存文件名
  14.         $ext=strrchr($url,'.');
  15.         if($ext!='.gif'&&$ext!='.jpg'){
  16.                         return array('file_name'=>'','save_path'=>'','error'=>3);
  17.                 }
  18.         $filename=time().$ext;
  19.     }
  20.         if(0!==strrpos($save_dir,'/')){
  21.                 $save_dir.='/';
  22.         }
  23.         //创建保存目录
  24.         if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true)){
  25.                 return array('file_name'=>'','save_path'=>'','error'=>5);
  26.         }
  27.     //获取远程文件所采用的方法
  28.     if($type){
  29.                 $ch=curl_init();
  30.                 $timeout=5;
  31.                 curl_setopt($ch,CURLOPT_URL,$url);
  32.                 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  33.                 curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
  34.                 $img=curl_exec($ch);
  35.                 curl_close($ch);
  36.     }else{
  37.             ob_start();
  38.             readfile($url);
  39.             $img=ob_get_contents();
  40.             ob_end_clean();
  41.     }
  42.     //$size=strlen($img);
  43.     //文件大小
  44.     $fp2=@fopen($save_dir.$filename,'a');
  45.     fwrite($fp2,$img);
  46.     fclose($fp2);
  47.         unset($img,$url);
  48.     return array('file_name'=>$filename,'save_path'=>$save_dir.$filename,'error'=>0);
  49. }
复制代码

 楼主| 发表于 2013-11-1 15:15:09 | 显示全部楼层

PHP采集远程图片

        当我们需要采集网络上的某个网页内容时,如果目标网站上的图片做了防盗链的话,我们直接采集过来的图片在自己网站上是不可用的。那么我们使用程序将目标网站上的图片下载到我们网站服务器上,然后就可调用图片了。
        本文将使用PHP实现采集远程图片功能。基本流程:
        1、获取目标网站图片地址。
        2、读取图片内容。
        3、创建要保存图片的路径并命名图片名称。
        4、写入图片内容。
        5、完成。
        我们通过写几个函数来实现这一过程。
        函数make_dir()建立目录。判断要保存的图片文件目录是否存在,如果不存在则创建目录,并且将目录设置为可写权限。
  1. function make_dir($path){
  2.     if(!file_exists($path)){//不存在则建立
  3.         $mk=@mkdir($path,0777); //权限
  4.         @chmod($path,0777);
  5.     }
  6.     return true;
  7. }
复制代码

函数read_filetext()取得图片内容。使用fopen打开图片文件,然后fread读取图片文件内容。
  1. function read_filetext($filepath){
  2.     $filepath=trim($filepath);
  3.     $htmlfp=@fopen($filepath,"r");
  4.     //远程
  5.     if(strstr($filepath,"://")){
  6.         while($data=@fread($htmlfp,500000)){
  7.             $string.=$data;
  8.         }
  9.     }
  10.     //本地
  11.     else{
  12.         $string=@fread($htmlfp,@filesize($filepath));
  13.     }
  14.     @fclose($htmlfp);
  15.     return $string;
  16. }
复制代码

函数write_filetext()写文件,将图片内容fputs写入文件中,即保存图片文件。
  1. function write_filetext($filepath,$string){
  2.     //$string=stripSlashes($string);
  3.     $fp=@fopen($filepath,"w");
  4.     @fputs($fp,$string);
  5.     @fclose($fp);
  6. }
复制代码

函数get_filename()获取图片名称,也可以自定义要保存的文件名。
  1. function get_filename($filepath){
  2.     $fr=explode("/",$filepath);
  3.     $count=count($fr)-1;
  4.     return $fr[$count];
  5. }
复制代码

然后将几个函数组合,在函数save_pic()中调用,最后返回保存后的图片路径。
  1. function save_pic($url,$savepath=''){
  2.     //处理地址
  3.     $url=trim($url);
  4.     $url=str_replace(" ","%20",$url);
  5.     //读文件
  6.     $string=read_filetext($url);
  7.     if(empty($string)){
  8.         echo '读取不了文件';exit;
  9.     }
  10.     //文件名
  11.     $filename = get_filename($url);
  12.     //存放目录
  13.     make_dir($savepath); //建立存放目录
  14.     //文件地址
  15.     $filepath = $savepath.$filename;
  16.     //写文件
  17.     write_filetext($filepath,$string);
  18.     return $filepath;
  19. }
复制代码

最后一步就是调用save_pic()函数保存图片,我们使用以下代码做测试。


//目标图片地址
$pic = "http://img0.pconline.com.cn/pconline/1205/06/2776119_end1_thumb.jpg";
//保存目录
$savepath = "images/";
echo save_pic($pic,$savepath);

实际应用中,我们可能会采集某个站点的内容,比如产品信息,包括采集防盗链的图片保存到网站上服务器上。这时我们可以使用正则匹配页面内容,将页面中相匹配的图片都找出来,然后分别下载到网站服务器上,完成图片的采集。以下代码仅供测试:
  1. function get_pic($cont,$path){
  2.     $pattern_src = '/<[img|IMG].*?src=[\'|"](.*?(?:[\.gif|\.jpg]))[\'|"].*?[\/]?>/';
  3.     $num = preg_match_all($pattern_src, $cont, $match_src);
  4.     $pic_arr = $match_src[1]; //获得图片数组
  5.     foreach ($pic_arr as $pic_item) { //循环取出每幅图的地址
  6.         save_pic($pic_item,$path); //下载并保存图片
  7.         echo "[OK]..!";
  8.     }
  9. }
复制代码

然后我们通过分析页面内容,将主体内容找出来,调用get_pic()实现图片的保存。
  1. //我们采集太平洋电脑网上一篇关于手机报道内容页的图片
  2. $url = "http://gz.pconline.com.cn/321/3215791.html";

  3. $content = file_get_contents($url);//获取网页内容
  4. $preg = '#<div class="art_con">(.*)<div class="ivy620 ivy620Ex"></div>#iUs';
  5. preg_match_all($preg, $content, $arr);
  6. $cont = $arr[1][0];  
  7. get_pic($cont,'img/');
复制代码

还有些场景没考虑进去,比如目标网站做了302多次跳转的,目标网站做了多种防采集的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|BC Morning Website ( Best Deal Inc. 001 )  

GMT-8, 2025-12-12 22:30 , Processed in 0.013662 second(s), 16 queries .

Supported by Best Deal Online X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表