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


Posted in PHP onAugust 02, 2019

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

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

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

(图一)

下面是在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数据库表):

CREATE TABLE IF NOT EXISTS `t_url` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `url` varchar(100) NOT NULL,
 `pictype` tinyint(1) unsigned NOT NULL COMMENT '1.非比例缩略图2比例缩略图
 `flag` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0.禁用1.可用
 PRIMARY KEY (`id`)
) 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代码:

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

运行结果:

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

(图二)

四、执行批处理文件

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

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

(图三)

五、创建缩略图

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

ceate_image_img.php代码:

<?php
mysql_connect("localhost","root","123456");
mysql_select_db("test");
if(!isset($_GET['ID'])){
 $_GET['ID'] = 1;
}
if($_GET['ID']){
 $sql = "select * from t_url id =".$_GET['ID'];
 $query = mysql_query($sql);
 $row = mysql_fetch_array($query);
 echo "<span style='color:#CE0000;'>正在生成缩略图:</span>".$row['id']." ".$row['url']."<br><br>";
  $url = $row['url'];
  $url_md5 = md5($url);
  $pictype = $row['pictype'];
  $limit_time = 1;                         //创建 $limit_time日内创建的大图,天
  $thumbnails_folder = 'img_tmp/';             //保存临时大图的目录,必须以/结束
  $thumbnails_folder2 = 'img/';               //保存小图的目录,必须以/结束
  $output_format = 'jpg';
  $cached_filename = $thumbnails_folder.$url_md5.".".$output_format;
  $to_filename = $thumbnails_folder2 .$url_md5.'.'.$output_format;
    if((file_exists($cached_filename) || filemtime ($filename) + $limit_time*86400 > time())
     && !file_exists($to_filename)){
     if (filesize($cached_filename) > 1024){ //字节,不能是空白图片
       //创建缩略图
        include("image.class.php");
        $img = new Zubrag_image;
        // get parameters
        $img->image_type  = 2; // 1 = GIF, 2 = JPG, 3 = PNG
        $img->quality   = 80;
        $img->max_w    = 90;
        $img->max_h    = 67;
        $img->iscapt = ($pictype == 1) ? true : false; //此处用布尔型即可,数据库不可1.非比例缩略图2.按比例缩略
        if($img->GenerateThumbFile($cached_filename, $to_filename)){
         echo "<span style='color:#CE0000;'>成功创建缩略图:</span>".$row['id']." ".$row['url'];
        }else{
         echo "<span style='color:#0000CE;'>未能创建缩略图:</span>".$row['id']." ".$row['url'];
        }
      }
    }
 $sql = "select * from t_url id >".$_GET['ID']." and flag = 1 order by id asc limit 1";
 $query = mysql_query($sql);
 $row = mysql_fetch_array($query);
 echo "<br><span style='color:#0000CE;'>准备生成缩略图:</span>".$row['id']." ".$row['url']."<br><br>";
 if($row['id']){
  echo "<script>window.location.href='create_image_img.php?ID=".$row['id']."';</script>";
 }else{
  $_GET['ID'] = "";
 }
}
?>

image.class.php代码:

<?php
class Zubrag_image {
 var $iscapt = true;
 var $image_type = -1;
 var $quality = 100;
 var $max_w = 100;
 var $max_h = 100;
 function SaveImage($im, $filename) {
  $res = null;
  if(($this->image_type == 1) && !function_exists('imagegif')) $this->image_type = 3;
  switch ($this->image_type) {
   case 1:
    //if ($this->save_to_file) {
     $res = ImageGIF($im,$filename);
    //}
    //else {
    // header("Content-type: image/gif");
    // $res = ImageGIF($im);
    //}
    break;
   case 2:
     $res = ImageJPEG($im,$filename,$this->quality);
    break;
   case 3:
     $res = ImagePNG($im,$filename);
    break;
  }
  return $res;
 }
 function ImageCreateFromType($type,$filename) {
   $im = NULL;
   switch ($type) {
    case 1:
     $im = ImageCreateFromGif($filename);
     break;
    case 2:
     $im = ImageCreateFromJpeg($filename);
     break;
    case 3:
     $im = ImageCreateFromPNG($filename);
     break;
  }
  return $im;
 }
 function GenerateThumbFile($from_name, $to_name) {
  list($orig_x, $orig_y, $orig_img_type, $img_sizes) = GetImageSize($from_name);
  /*if ($this->cut_x > 0) $orig_x = min($this->cut_x, $orig_x);
  if ($this->cut_y > 0) $orig_y = min($this->cut_y, $orig_y);*/
    if ($this->iscapt && (($orig_y/$orig_x) > (90/67))) { //是截图,且高度过高
     $orig_y = $orig_x*(67/90);
    }
  $this->image_type = ($this->image_type != -1 ? $this->image_type : $orig_img_type);
  if ($orig_img_type < 1 or $orig_img_type > 3) die("Image type not supported");
  if ($this->image_type == 1) {
   $ni = imagecreate($this->max_w, $this->max_h);
  }
  else {
   $ni = imagecreatetruecolor($this->max_w,$this->max_h);
  }
  $white = imagecolorallocate($ni, 255, 255, 255);
  imagefilledrectangle( $ni, 0, 0, $this->max_w, $this->max_h, $white);
  $im = $this->ImageCreateFromType($orig_img_type,$from_name);
  imagepalettecopy($ni,$im);
  imagecopyresampled(
   $ni, $im,
   0, 0, 0, 0,
   $this->max_w, $this->max_h,
   $orig_x, $orig_y);
  if($this->SaveImage($ni, $to_name)){
     return true;
  }else{
     return false;
  }
 }
}
?>

六、总结

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

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 文件类型判断代码
Mar 13 PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 PHP
php中使用redis队列操作实例代码
Feb 07 PHP
thinkphp控制器调度使用示例
Feb 24 PHP
destoon设置自定义搜索的方法
Jun 21 PHP
php对文件进行hash运算的方法
Apr 03 PHP
PHP中strpos、strstr和stripos、stristr函数分析
Jun 11 PHP
Yii2框架实现数据库常用操作总结
Feb 08 PHP
php解析mht文件转换成html的实例
Mar 13 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
java解析json方法总结
May 16 PHP
swoole锁的机制代码实例讲解
Mar 04 PHP
php抽象类和接口知识点整理总结
Aug 02 #PHP
使用composer 安装 laravel框架的方法图文详解
Aug 02 #PHP
php菜单/评论数据递归分级算法的实现方法
Aug 01 #PHP
PHP实现微信提现(企业付款到零钱)
Aug 01 #PHP
php curl发送请求实例方法
Aug 01 #PHP
php layui实现前端多图上传实例
Jul 30 #PHP
安装docker和docker-compose实例详解
Jul 30 #PHP
You might like
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
2013/07/08 Javascript
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
javascript简单判断输入内容是否合法的方法
2016/05/11 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
axios发送post请求springMVC接收不到参数的解决方法
2018/03/05 Javascript
vue中Element-ui 输入银行账号每四位加一个空格的实现代码
2018/09/14 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
2018/09/27 Javascript
百度小程序自定义通用toast组件
2019/07/17 Javascript
解决LayUI数据表格复选框不居中显示的问题
2019/09/25 Javascript
js回调函数仿360开机
2019/12/26 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
2020/01/12 Javascript
ES2020 新特性(种草)
2020/01/12 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
微信小程序清空输入框信息与实现屏幕往上滚动的示例代码
2020/06/23 Javascript
Python的print用法示例
2014/02/11 Python
python编程实现12306的一个小爬虫实例
2017/12/27 Python
对python Tkinter Text的用法详解
2018/10/11 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
使用Python函数进行模块化的实现
2019/11/15 Python
Python读取csv文件实例解析
2019/12/30 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
职业生涯规划设计步骤
2014/01/12 职场文书
25岁生日感言
2014/01/13 职场文书
考核工作实施方案
2014/03/30 职场文书
校运动会广播稿(100篇)
2014/09/12 职场文书
关于安全的广播稿
2014/10/23 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书