当前位置:首页 > PHP教程 > php环境安装 > 列表

Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解

发布:smiling 来源: PHP粉丝网  添加日期:2021-12-08 11:41:52 浏览: 评论:0 

本文实例讲述了Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能,分享给大家供大家参考,具体如下:

最近在开发一个本地互联网应用的项目,为了增加用户体验,需要在搜索结果左侧显示如图一所示的某个网站的缩略图效果,在网上不停地百度谷歌了一上午后,发现大多数实现少量截图还是可以的,如果大批量的截图总会在中途出现很多问题,最终也没有发现十分满意的程序,干脆自己弄吧。

PHP+IECapt PHP批量截图

(图一)

下面是在windows环境下用php结合iecapt实现的网页截图并创建缩略图的步骤和代码:

一、准备

下载最新版IECapt

官方地址:http://iecapt.sourceforge.net/

在linux环境下,可以考虑用HTML2Image来实现

下载地址:http://www.guangmingsoft.net/htmlsnapshot/html2image.i386.tar.gz

其它的实现方式还有CutyCapt,另外,只要是windows环境,有IE浏览器(推荐使用IE7)即可,这个大部分机器都应该不是问题。

二、创建数据表(这一步非必须,根据实际情况选用)

因为要批量截图,数据十分的多,建立一个数据表来存放要截图的网站的url地址还是有必要的,如下所示(mysql数据库表):

  1. CREATE TABLE IF NOT EXISTS `t_url` ( 
  2.  `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
  3.  `url` varchar(100) NOT NULL
  4.  `pictype` tinyint(1) unsigned NOT NULL COMMENT '1.非比例缩略图2比例缩略图 
  5.  `flag` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0.禁用1.可用 
  6.  PRIMARY KEY (`id`) 
  7. ) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='url链接表' AUTO_INCREMENT=1 ; 

三、创建批处理文件

1.首先把下载的iecapt压缩包解压,然后把iecapt.exe放到要生成截图的文件夹下(如:img_tmp)。

为了便于理解,在看下面代码前,先创建一个test.bat文件,鼠标右击编辑,写入一句话if not exist ay360cn.jpg (iecapt.exe --url=http://www.ay360.cn/ --out=ay360cn.jpg)保存,双击运行test.bat看看是否会在本目录下多出一个名叫ay360cn.jpg的文件,如果看到说明截图成功,这句话是截图的核心语句。

2.将需要截图的url链接导入url链接表t_url,然后执行如下php代码:

  1. <?php 
  2. //------------------------------------------------------------ 
  3. //从表t_url中提取url链接,存放到数组$data中 
  4. //-------------------------------------------------------------- 
  5. mysql_connect("localhost","root","123"); 
  6. mysql_select_db("test"); 
  7. $sql = "select * from t_url"
  8. //选用sql语句$sql2 = "select * from t_url where pictype = 1 and flag = 1"; 
  9. $query = mysql_query($sql); 
  10. //------------------------------------------ 
  11. //生成批处理文件 
  12. //------------------------------------------ 
  13. $expire_time = 10;  //代表10天,文件过期时间,86400秒/天 
  14. $i = 0; 
  15. foreach($row = mysql_fetch_array($query)){ 
  16.  $url_md5 = md5($row['url']); 
  17.  $file_folder = 'img/'
  18.  $filename = $file_folder.$url_md5.'.'.'jpg'
  19.  $newname = $url_md5.'.'.'jpg'
  20.  if (!file_exists($filename) || (filemtime ($filename) + $expire_time * 86400 < time()) ) { 
  21.     $str .= "if not exist ".$newname." (iecapt.exe --url=".$value['url']." --out=".$newname.")\r\n"
  22.     if(($i % 30) == 0 && $i > 0){   //每30条为一个批处理文件 
  23.        $title = "title capt".$i.".bat\r\n"
  24.        $str = $title.$str
  25.        $file_bat = fopen("img_tmp/capt".$i.".bat","w"); 
  26.        if(fwrite($file_bat,$str)){ 
  27.         echo "批处理文件capt".$i."生成成功<br>"
  28.         $str = ""
  29.        } 
  30.     } 
  31.     $i = $i+1; 
  32.  } 
  33. ?> 

运行结果:

PHP+IECapt PHP批量截图

(图二)

四、执行批处理文件

可以通过php程序循环执行 批处理文件,但在运行当中会出现很多问题,这里手动直接批量打开上面刚创建好的批处理文件,考虑到带宽和cpu,最多不要超过20个,截图的速度大约3-5秒/张效果如图三:

PHP+IECapt PHP批量截图

(图三)

五、创建缩略图

生成缩略图的文件是create_image_img.php,其中包含生成缩略图的主要的一个类文件是image.class.php,两个文件的代码如下:

ceate_image_img.php代码:

  1. <?php 
  2. mysql_connect("localhost","root","123456"); 
  3. mysql_select_db("test"); 
  4. if(!isset($_GET['ID'])){ 
  5.  $_GET['ID'] = 1; 
  6. if($_GET['ID']){ 
  7.  $sql = "select * from t_url id =".$_GET['ID']; 
  8.  $query = mysql_query($sql); 
  9.  $row = mysql_fetch_array($query); 
  10.  echo "<span style='color:#CE0000;'>正在生成缩略图:</span>".$row['id']."&nbsp;".$row['url']."<br><br>"
  11.   $url = $row['url']; 
  12.   $url_md5 = md5($url); 
  13.   $pictype = $row['pictype']; 
  14.   $limit_time = 1;                         //创建 $limit_time日内创建的大图,天 
  15.   $thumbnails_folder = 'img_tmp/';             //保存临时大图的目录,必须以/结束 
  16.   $thumbnails_folder2 = 'img/';               //保存小图的目录,必须以/结束 
  17.   $output_format = 'jpg'
  18.   $cached_filename = $thumbnails_folder.$url_md5.".".$output_format
  19.   $to_filename = $thumbnails_folder2 .$url_md5.'.'.$output_format
  20.     if((file_exists($cached_filename) || filemtime ($filename) + $limit_time*86400 > time()) 
  21.      && !file_exists($to_filename)){ 
  22.      if (filesize($cached_filename) > 1024){ //字节,不能是空白图片 
  23.        //创建缩略图 
  24.         include("image.class.php"); 
  25.         $img = new Zubrag_image; 
  26.         // get parameters 
  27.         $img->image_type  = 2; // 1 = GIF, 2 = JPG, 3 = PNG 
  28.         $img->quality   = 80; 
  29.         $img->max_w    = 90; 
  30.         $img->max_h    = 67; 
  31.         $img->iscapt = ($pictype == 1) ? true : false; //此处用布尔型即可,数据库不可1.非比例缩略图2.按比例缩略 
  32.         if($img->GenerateThumbFile($cached_filename$to_filename)){ 
  33.          echo "<span style='color:#CE0000;'>成功创建缩略图:</span>".$row['id']."&nbsp;".$row['url']; 
  34.         }else
  35.          echo "<span style='color:#0000CE;'>未能创建缩略图:</span>".$row['id']."&nbsp;".$row['url']; 
  36.         } 
  37.       } 
  38.     } 
  39.  $sql = "select * from t_url id >".$_GET['ID']." and flag = 1 order by id asc limit 1"
  40.  $query = mysql_query($sql); 
  41.  $row = mysql_fetch_array($query); 
  42.  echo "<br><span style='color:#0000CE;'>准备生成缩略图:</span>".$row['id']."&nbsp;".$row['url']."<br><br>"
  43.  if($row['id']){ 
  44.   echo "<script>window.location.href='create_image_img.php?ID=".$row['id']."';</script>"; 
  45.  }else
  46.   $_GET['ID'] = ""
  47.  } 
  48. ?> 

image.class.php代码:

  1. <?php 
  2. class Zubrag_image { 
  3.  var $iscapt = true; 
  4.  var $image_type = -1; 
  5.  var $quality = 100; 
  6.  var $max_w = 100; 
  7.  var $max_h = 100; 
  8.  function SaveImage($im$filename) { 
  9.   $res = null; 
  10.   if(($this->image_type == 1) && !function_exists('imagegif')) $this->image_type = 3; 
  11.   switch ($this->image_type) { 
  12.    case 1: 
  13.     //if ($this->save_to_file) { 
  14.      $res = ImageGIF($im,$filename); 
  15.     //} 
  16.     //else { 
  17.     // header("Content-type: image/gif"); 
  18.     // $res = ImageGIF($im); 
  19.     //} 
  20.     break
  21.    case 2: 
  22.      $res = ImageJPEG($im,$filename,$this->quality); 
  23.     break
  24.    case 3: 
  25.      $res = ImagePNG($im,$filename); 
  26.     break
  27.   } 
  28.   return $res
  29.  } 
  30.  function ImageCreateFromType($type,$filename) { 
  31.    $im = NULL; 
  32.    switch ($type) { 
  33.     case 1: 
  34.      $im = ImageCreateFromGif($filename); 
  35.      break
  36.     case 2: 
  37.      $im = ImageCreateFromJpeg($filename); 
  38.      break
  39.     case 3: 
  40.      $im = ImageCreateFromPNG($filename); 
  41.      break
  42.   } 
  43.   return $im
  44.  } 
  45.  function GenerateThumbFile($from_name$to_name) { 
  46.   list($orig_x$orig_y$orig_img_type$img_sizes) = GetImageSize($from_name); 
  47.   /*if ($this->cut_x > 0) $orig_x = min($this->cut_x, $orig_x); 
  48.   if ($this->cut_y > 0) $orig_y = min($this->cut_y, $orig_y);*/ 
  49.     if ($this->iscapt && (($orig_y/$orig_x) > (90/67))) { //是截图,且高度过高 
  50.      $orig_y = $orig_x*(67/90); 
  51.     } 
  52.   $this->image_type = ($this->image_type != -1 ? $this->image_type : $orig_img_type); 
  53.   if ($orig_img_type < 1 or $orig_img_type > 3) die("Image type not supported"); 
  54.   if ($this->image_type == 1) { 
  55.    $ni = imagecreate($this->max_w, $this->max_h); 
  56.   } 
  57.   else { 
  58.    $ni = imagecreatetruecolor($this->max_w,$this->max_h); 
  59.   } 
  60.   $white = imagecolorallocate($ni, 255, 255, 255); 
  61.   imagefilledrectangle( $ni, 0, 0, $this->max_w, $this->max_h, $white); 
  62.   $im = $this->ImageCreateFromType($orig_img_type,$from_name); 
  63.   imagepalettecopy($ni,$im); 
  64.   imagecopyresampled( 
  65.    $ni$im
  66.    0, 0, 0, 0, 
  67.    $this->max_w, $this->max_h, 
  68.    $orig_x$orig_y); 
  69.   if($this->SaveImage($ni$to_name)){ 
  70.      return true; 
  71.   }else
  72.      return false; 
  73.   } 
  74.  } 
  75. ?> 

六、总结

至此整个实现网页截图并创建缩略图的的步骤结束,其中执行批处理文件部分为了提高截图效率采用手动的方式,批量打开批处理文件,另外,链接数据库部分还可以用封装的数据库操作类来实现,代码会更加简洁。

Tags: PHP+IECapt PHP批量截图

分享到: