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 相关文章推荐
xajax写的留言本
Nov 25 PHP
坏狼的PHP学习教程之第1天
Jun 15 PHP
PHP 手机归属地查询 api
Feb 08 PHP
mayfish 数据入库验证代码
Apr 30 PHP
php学习笔记 类的声明与对象实例化
Jun 13 PHP
基于PHP array数组的教程详解
Jun 05 PHP
使用Sphinx对索引进行搜索
Jun 25 PHP
根据中文裁减字符串函数的php代码
Dec 03 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
Nov 19 PHP
thinkPHP中session()方法用法详解
Dec 08 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
Jun 04 PHP
PHP PDOStatement::debugDumpParams讲解
Jan 30 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实现验证码功能
2006/10/09 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
如何实现JS函数的重载
2006/09/22 Javascript
jquery $.ajax入门应用二
2008/11/19 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
2015/11/23 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
EasyUI布局 高度自适应
2016/06/04 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
JavaScript 随机验证码的生成实例代码
2016/09/22 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
2017/07/13 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
深入浅析ImageMagick命令执行漏洞
2016/10/11 Python
python生成1行四列全2矩阵的方法
2018/08/04 Python
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
python 标准差计算的实现(std)
2019/07/29 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
CSS3中动画属性transform、transition和animation属性的区别
2016/09/25 HTML / CSS
使用HTML5的表单验证的简单示例
2015/09/09 HTML / CSS
澳大利亚优惠网站:Deals.com.au
2019/07/02 全球购物
诚信考试标语
2014/06/24 职场文书
同学聚会致辞集锦
2015/07/28 职场文书
《正比例》教学反思
2016/02/23 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python