最近在开发一个本地互联网应用的项目,为了增加用户体验,需要在搜索结果左侧显示如图一所示的某个网站的缩略图效果,在网上不停地百度谷歌了一上午后,发现大多数实现少量截图还是可以的,如果大批量的截图总会在中途出现很多问题,最终也没有发现十分满意的程序,干脆自己弄吧。
(图一)
下面是在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代码:
1 <?php 2 3 //------------------------------------------------------------ 4 //从表t_url中提取url链接,存放到数组$data中 5 //-------------------------------------------------------------- 6 7 mysql_connect("localhost","root","123"); 8 mysql_select_db("test"); 9 $sql = "select * from t_url";10 //选用sql语句$sql2 = "select * from t_url where pictype = 1 and flag = 1";11 12 $query = mysql_query($sql); 13 14 //------------------------------------------15 //生成批处理文件16 //------------------------------------------17 18 $expire_time = 10; //代表10天,文件过期时间,86400秒/天19 $i = 0;20 foreach($row = mysql_fetch_array($query)){21 $url_md5 = md5($row['url']);22 $file_folder = 'img/';23 $filename = $file_folder.$url_md5.'.'.'jpg';24 $newname = $url_md5.'.'.'jpg'; 25 26 if (!file_exists($filename) || (filemtime ($filename) + $expire_time * 86400 < time()) ) { 27 28 $str .= "if not exist ".$newname." (iecapt.exe --url=".$value['url']." --out=".$newname.")\r\n"; 29 30 if(($i % 30) == 0 && $i > 0){ //每30条为一个批处理文件31 $title = "title capt".$i.".bat\r\n";32 $str = $title.$str; 33 $file_bat = fopen("img_tmp/capt".$i.".bat","w"); 34 35 if(fwrite($file_bat,$str)){36 echo "批处理文件capt".$i."生成成功<br>";37 $str = "";38 } 39 } 40 $i = $i+1;41 } 42 } 43 ?>
运行结果:
(图二)
四、执行批处理文件
可以通过php程序循环执行 批处理文件,但在运行当中会出现很多问题,这里手动直接批量打开上面刚创建好的批处理文件,考虑到带宽和cpu,最多不要超过20个,截图的速度大约3-5秒/张效果如图三:
(图三)
五、创建缩略图
生成缩略图的文件是create_image_img.php,其中包含生成缩略图的主要的一个类文件是image.class.php,两个文件的代码如下:
ceate_image_img.php代码:
1 <?php 2 mysql_connect("localhost","root","123456"); 3 mysql_select_db("test"); 4 5 6 if(!isset($_GET['ID'])){ 7 $_GET['ID'] = 1; 8 } 9 10 if($_GET['ID']){ 11 $sql = "select * from t_url id =".$_GET['ID'];12 $query = mysql_query($sql);13 $row = mysql_fetch_array($query); 14 15 echo "<span style='color:#CE0000;'>正在生成缩略图:</span>".$row['id']." ".$row['url']."<br><br>"; 16 17 $url = $row['url']; 18 $url_md5 = md5($url);19 $pictype = $row['pictype']; 20 21 $limit_time = 1; //创建 $limit_time日内创建的大图,天22 $thumbnails_folder = 'img_tmp/'; //保存临时大图的目录,必须以/结束23 $thumbnails_folder2 = 'img/'; //保存小图的目录,必须以/结束 24 $output_format = 'jpg'; 25 $cached_filename = $thumbnails_folder.$url_md5.".".$output_format;26 27 $to_filename = $thumbnails_folder2 .$url_md5.'.'.$output_format; 28 29 if((file_exists($cached_filename) || filemtime ($filename) + $limit_time*86400 > time())30 && !file_exists($to_filename)){ 31 32 if (filesize($cached_filename) > 1024){ //字节,不能是空白图片33 //创建缩略图34 include("image.class.php");35 $img = new Zubrag_image; 36 37 // get parameters38 $img->image_type = 2; // 1 = GIF, 2 = JPG, 3 = PNG39 $img->quality = 80;40 $img->max_w = 90;41 $img->max_h = 67;42 $img->iscapt = ($pictype == 1) ? true : false; //此处用布尔型即可,数据库不可1.非比例缩略图2.按比例缩略 43 44 if($img->GenerateThumbFile($cached_filename, $to_filename)){ 45 echo "<span style='color:#CE0000;'>成功创建缩略图:</span>".$row['id']." ".$row['url']; 46 }else{ 47 echo "<span style='color:#0000CE;'>未能创建缩略图:</span>".$row['id']." ".$row['url'];48 } 49 } 50 } 51 52 $sql = "select * from t_url id >".$_GET['ID']." and flag = 1 order by id asc limit 1";53 $query = mysql_query($sql);54 $row = mysql_fetch_array($query); 55 56 echo "<br><span style='color:#0000CE;'>准备生成缩略图:</span>".$row['id']." ".$row['url']."<br><br>"; 57 58 if($row['id']){ 59 echo "<script>window.location.href='create_image_img.php?ID=".$row['id']."';</script>";60 }else{61 $_GET['ID'] = "";62 } 63 } 64 65 ?>
image.class.php代码:
1 <?php 2 3 class Zubrag_image { 4 5 var $iscapt = true; 6 var $image_type = -1; 7 var $quality = 100; 8 var $max_w = 100; 9 var $max_h = 100; 10 11 function SaveImage($im, $filename) { 12 $res = null; 13 if(($this->image_type == 1) && !function_exists('imagegif')) $this->image_type = 3; 14 switch ($this->image_type) {15 case 1:16 //if ($this->save_to_file) {17 $res = ImageGIF($im,$filename);18 //}19 //else {20 // header("Content-type: image/gif");21 // $res = ImageGIF($im);22 //}23 break;24 case 2: 25 $res = ImageJPEG($im,$filename,$this->quality); 26 break;27 case 3: 28 $res = ImagePNG($im,$filename); 29 break;30 } 31 return $res;32 } 33 34 function ImageCreateFromType($type,$filename) {35 $im = NULL;36 switch ($type) {37 case 1:38 $im = ImageCreateFromGif($filename);39 break;40 case 2:41 $im = ImageCreateFromJpeg($filename);42 break;43 case 3:44 $im = ImageCreateFromPNG($filename);45 break;46 }47 return $im;48 }49 50 51 function GenerateThumbFile($from_name, $to_name) { 52 list($orig_x, $orig_y, $orig_img_type, $img_sizes) = GetImageSize($from_name); 53 /*if ($this->cut_x > 0) $orig_x = min($this->cut_x, $orig_x);54 if ($this->cut_y > 0) $orig_y = min($this->cut_y, $orig_y);*/55 if ($this->iscapt && (($orig_y/$orig_x) > (90/67))) { //是截图,且高度过高 56 $orig_y = $orig_x*(67/90); 57 }58 59 $this->image_type = ($this->image_type != -1 ? $this->image_type : $orig_img_type); 60 61 if ($orig_img_type < 1 or $orig_img_type > 3) die("Image type not supported"); 62 63 if ($this->image_type == 1) { 64 $ni = imagecreate($this->max_w, $this->max_h);65 }66 else { 67 $ni = imagecreatetruecolor($this->max_w,$this->max_h);68 } 69 70 $white = imagecolorallocate($ni, 255, 255, 255);71 imagefilledrectangle( $ni, 0, 0, $this->max_w, $this->max_h, $white); 72 73 $im = $this->ImageCreateFromType($orig_img_type,$from_name); 74 imagepalettecopy($ni,$im); 75 imagecopyresampled(76 $ni, $im, 77 0, 0, 0, 0, 78 $this->max_w, $this->max_h, 79 $orig_x, $orig_y); 80 if($this->SaveImage($ni, $to_name)){81 return true;82 }else{83 return false;84 }85 } 86 } 87 88 ?>
六、总结
至此整个实现网页截图并创建缩略图的的步骤结束,其中执行批处理文件部分为了提高截图效率采用手动的方式,批量打开批处理文件,另外,链接数据库部分还可以用封装的数据库操作类来实现,代码会更加简洁。

長URL(通常用關鍵字和跟踪參數都混亂)可以阻止訪問者。 URL縮短腳本提供了解決方案,創建了簡潔的鏈接,非常適合社交媒體和其他平台。 這些腳本對於單個網站很有價值

Laravel使用其直觀的閃存方法簡化了處理臨時會話數據。這非常適合在您的應用程序中顯示簡短的消息,警報或通知。 默認情況下,數據僅針對後續請求: $請求 -

這是有關用Laravel後端構建React應用程序的系列的第二個也是最後一部分。在該系列的第一部分中,我們使用Laravel為基本的產品上市應用程序創建了一個RESTFUL API。在本教程中,我們將成為開發人員

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显著减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

PHP客戶端URL(curl)擴展是開發人員的強大工具,可以與遠程服務器和REST API無縫交互。通過利用Libcurl(備受尊敬的多協議文件傳輸庫),PHP curl促進了有效的執行

您是否想為客戶最緊迫的問題提供實時的即時解決方案? 實時聊天使您可以與客戶進行實時對話,並立即解決他們的問題。它允許您為您的自定義提供更快的服務

2025年的PHP景觀調查調查了當前的PHP發展趨勢。 它探討了框架用法,部署方法和挑戰,旨在為開發人員和企業提供見解。 該調查預計現代PHP Versio的增長

在本文中,我們將在Laravel Web框架中探索通知系統。 Laravel中的通知系統使您可以通過不同渠道向用戶發送通知。今天,我們將討論您如何發送通知OV


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

記事本++7.3.1
好用且免費的程式碼編輯器