登录 注册

PHP压缩网络图片

由于昨天发现B站的CDN开启了防盗链,因此今天自己做了一个读取B站图片并且进行压缩处理的程序

首先是获取图片部分,用CURL简单的进行获取,注意需要把referer设置为B站的页面,否则会403。获取后,我们获得了一个$output,即为此图片的bit。

$ch=curl_init();
$header=Array();
$header[]='Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, text/html, * /* ';
$header[]='Accept-Language: zh-cn ';
$header[]='User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) ';
$header[]='Host: i2.hdslb.com';
$header[]='Referer: http://www.bilibili.com';
$header[]='Connection: Keep-Alive ';
$header[]='Cookie: '.$config['bilibilicookie'];
curl_setopt($ch,CURLOPT_HTTPHEADER,$header); 
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$output=curl_exec($ch);
curl_close($ch);

然后先获取原图尺寸:

list($width,$height,$type,$attr)=getimagesizefromstring($output);

此处可以获取高宽,图片类型(jpg/png/gif等),不过B站的图片都是jpg,所以无所谓。。。当然,压缩后的尺寸需要自定义,可以是固定数值也可以是等比例缩放。

然后调用PHP原生的函数

$old=imagecreatefromstring($output);

将bit生成一个图片对象,同时也新建一个对象:

$new=imagecreatetruecolor($new_width,$new_height);

然后使用下面这个函数进行压缩。大体含义是将原图复制到新的空白图片对象中

imagecopyresampled($new,$old,0,0,0,0,$new_width,$new_height,$width,$height);

最后将此图保存

imagejpeg($new,$file);

$file为事先定义好的文件名。这里我查了很久API,没有查到源生的函数中有直接返回修改后图片bit的方法。因此我们只能先保存,再读取保存文件的bit,并输出:

$new_output=file_get_contents($file);
header('Content-type: image/jpg');
echo $new_output;

同时做一些数据库处理,保存此图片的hash,之后如果匹配到同样的图片就不用再跑一遍curl,可以直接输出已经保存的文件。

最后,不要忘记释放内存:

imagedestroy($new);
imagedestroy($old);

当然,最后的最后还要做一个计划任务,定时清理长久没有使用的图片,不然硬盘可是很贵的


2017
07 15
上一篇
Older
评论
0
点击
39
发布
我是标题
我是文字
我是标题
我是文字
用户名
密码
用户名
密码
重复密码
努力的加载中.....