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
下一篇
Newer
评论
1
点击
2948
这里是章鱼vpn的开发者站?
www.zyvpn.com的那个?
现在好像被封了是怎么回事