本文实例讲述了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