本文实例讲述了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; } } ?>
运行结果:
(图二)
四、执行批处理文件
可以通过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; } } } ?>
六、总结
至此整个实现网页截图并创建缩略图的的步骤结束,其中执行批处理文件部分为了提高截图效率采用手动的方式,批量打开批处理文件,另外,链接数据库部分还可以用封装的数据库操作类来实现,代码会更加简洁。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP图形与图片操作技巧汇总》、《PHP数组(Array)操作技巧大全》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP数学运算技巧总结》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
本文向大家介绍详解Java实现批量压缩图片裁剪压缩多种尺寸缩略图一键批量上传图片,包括了详解Java实现批量压缩图片裁剪压缩多种尺寸缩略图一键批量上传图片的使用技巧和注意事项,需要的朋友参考一下 10万+IT人都在关注的图片批量压缩上传方案(完整案例+代码) 背景需求:为了客户端访问图片资源时,加载图片更流畅,体验更好,通常不会直接用原图路径,需要根据不同的场景显示不同规格的缩略图,根据商品关键属
本文向大家介绍VBS实现截图功能,包括了VBS实现截图功能的使用技巧和注意事项,需要的朋友参考一下 百度说,VBS很难截图,倒是有个利用第三方软件的方法,调用该软件,然后该软件会自动截图。 但这样,违背了用VBS的初衷。 用VBS就是因为它方便快捷。要是用第三方软件的话,干脆我们直接用VB写一个好了。 那么...只好调用Excel用VBA去做了。 有什么更好的方法吗? 在度娘上翻了很久,没有什么好
本文向大家介绍C#实现网页画图功能,包括了C#实现网页画图功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C#实现网页画图的具体代码,供大家参考,具体内容如下 代码贴着保存下 效果如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
本文向大家介绍php实现粘贴截图并完成上传功能,包括了php实现粘贴截图并完成上传功能的使用技巧和注意事项,需要的朋友参考一下 今天发现segmentfault的评论留言里面可以粘贴上传图片,于是研究了下怎么实现的! 原理很简单其实就是监控粘贴事件,然后检测是否粘贴的东西里面有图片,有的话直接触发ajax上传 代码可以直接运行,有兴趣你们可以试试 以上所述就是本文的全部内容了,希望大家能够喜欢。
本文向大家介绍php生成图片缩略图功能示例,包括了php生成图片缩略图功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php生成图片缩略图功能。分享给大家供大家参考,具体如下: 完整代码如下(为方便阅读,代码使用http://tools.jb51.net/code/phpformat进行了格式化处理): PS:这里再为大家推荐几款比较实用的图片处理工具供大家参考使用: 在线图片转换
本文向大家介绍php实现图片缩略图的方法,包括了php实现图片缩略图的方法的使用技巧和注意事项,需要的朋友参考一下 本段代码实现功能有这些: 支持jpg,jpeg,gif,png,bmp图片格式,支持按原图片的比例进行缩放,可以选择在图片缩放的过程中是否需要对图片进行裁切,加入了图片质量控制,可以实现缩略图片质量最高化。 完整类的代码如下: 使用方法很简单代码如下: 以上代码是小编给大家分享的ph