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.")rn";
if(($i % 30) == 0 && $i 0){ //每30条为一个批处理文件
$title = "title capt".$i.".batrn";
$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;
}
}
?
运行结果:
(图二)
四、执行批处理文件
可以通过php程序循环执行 批处理文件,但在运行当中会出现很多问题,这里手动直接批量打开上面刚创建好的批处理文件,考虑到带宽和cpu,最多不要超过20个,截图的速度大约3-5秒/张效果如图三:
(图三)
五、创建缩略图
生成缩略图的文件是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;
}
}
}
?
六、总结
至此整个实现网页截图并创建缩略图的的步骤结束,其中执行批处理文件部分为了提高截图效率采用手动的方式,批量打开批处理文件,另外,链接数据库部分还可以用封装的数据库操作类来实现,代码会更加简洁。
- Oracle 快速插入1000万条数据的实现方式
- HashMap实现原理分析
- Oracle TM锁和TX锁
- Oracle给Select结果集加锁,Skip Locked(跳过加锁行获得可以加锁的结果集)
- select for update和select for update wait和select for update nowait的区别
- Android入门之动画
- Java 读写大文本文件
- 高级聚类
- Oracle 数据库名、实例名、Oracle_SID
- Oracle 多行、多列子查询
- Android入门介绍
- Oracle 数据表的管理
- Android资源混淆打包方案
- 手把手教你从Core Data迁移到Realm
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【笔记】《C++Primer》—— 第13章:拷贝控制
- 【笔记】《C++Primer》—— 第16章:模板与泛型编程
- 【笔记】《C++Primer》—— 第19章:特殊工具与技术
- 【翻译】C++14的新特性简介
- Python 为什么要有 pass 语句?
- 【翻译】C++17的新特性简介
- 各类SQL日期时间处理方法
- 这可能是最全最实用的Vim操作集合
- 个人珍藏的80道多线程并发面试题(1-10答案解析)
- 理解DOM Diff算法
- 腾讯云ES集群通过COS实现跨地域备份与恢复
- Thymeleaf一篇就够了
- python scipy.stats实现各种常见的统计分布
- 操作系统基础 - 文件系统
- Linux升级OpenSSH修复高危漏洞