本文实例讲述了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数据库表):
1
2
3
4
5
6
7
|
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代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<?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;
}
}
?>
|
运行结果:
(图二)
四、执行批处理文件
可以通过php程序循环执行 批处理文件,但在运行当中会出现很多问题,这里手动直接批量打开上面刚创建好的批处理文件,考虑到带宽和cpu,最多不要超过20个,截图的速度大约3-5秒/张效果如图三:
(图三)
五、创建缩略图
生成缩略图的文件是create_image_img.php,其中包含生成缩略图的主要的一个类文件是image.class.php,两个文件的代码如下:
ceate_image_img.php代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
<?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代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
<?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;
}
}
}
?>
|
六、总结
至此整个实现网页截图并创建缩略图的的步骤结束,其中执行批处理文件部分为了提高截图效率采用手动的方式,批量打开批处理文件,另外,链接数据库部分还可以用封装的数据库操作类来实现,代码会更加简洁。
原文链接:https://www.cnblogs.com/zhijiangch/p/5086184.html