PHP实现图片压缩同时保持清晰度

互动交流
3 76
tinypng的接口虽然很不错,但是一个月限制500次调用,懒得注册一堆帐号啊。
csdn找了个php压缩图片的。
PHP实现图片压缩同时保持清晰度

图片太大是一个经常遇到的问题,为此很多人头疼。今天告诉大家如何实现PHP程序简单实现压缩:

图片原大小:

压缩后:

这是我自己实验的,可以处理多种图片格式。

当然图片原图越大,越能体现出压缩来。

现在附上代码:

<?php

/**
* 图片压缩类:通过缩放来压缩。
* 如果要保持源图比例,把参数$percent保持为1即可。
* 即使原比例压缩,也可大幅度缩小。数码相机4M图片。也可以缩为700KB左右。如果缩小比例,则体积会更小。
*
* 结果:可保存、可直接显示。
*/
class imgcompress{
private $src;
private $image;
private $imageinfo;
private $percent = 0.5;
/**
* 图片压缩
* @param $src 源图
* @param float $percent 压缩比例
*/
public function __construct($src, $percent=1)
{
$this->src = $src;
$this->percent = $percent;
}
/** 高清压缩图片
* @param string $saveName 提供图片名(可不带扩展名,用源图扩展名)用于保存。或不提供文件名直接显示
*/
public function compressImg($saveName=’’)
{
$this->_openImage();
if(!empty($saveName)) $this->_saveImage($saveName); //保存
else $this->_showImage();
}
/**
* 内部:打开图片
*/
private function _openImage()
{
list($width, $height, $type, $attr) = getimagesize($this->src);
$this->imageinfo = array(
’width’=>$width,
’height’=>$height,
’type’=>image_type_to_extension($type,false),
’attr’=>$attr
);
$fun = "imagecreatefrom".$this->imageinfo[’type’];
$this->image = $fun($this->src);
$this->_thumpImage();
}
/**
* 内部:操作图片
*/
private function _thumpImage()
{
$new_width = $this->imageinfo[’width’] * $this->percent;
$new_height = $this->imageinfo[’height’] * $this->percent;
$image_thump = imagecreatetruecolor($new_width,$new_height);
//将原图复制带图片载体上面,并且按照一定比例压缩,极大的保持了清晰度
imagecopyresampled($image_thump,$this->image,0,0,0,0,$new_width,$new_height,$this->imageinfo[’width’],$this->imageinfo[’height’]);
imagedestroy($this->image);
$this->image = $image_thump;
}
/**
* 输出图片:保存图片则用saveImage()
*/
private function _showImage()
{
header(’Content-Type: image/’.$this->imageinfo[’type’]);
$funcs = "image".$this->imageinfo[’type’];
$funcs($this->image);
}
/**
* 保存图片到硬盘:
* @param string $dstImgName 1、可指定字符串不带后缀的名称,使用源图扩展名 。2、直接指定目标图片名带扩展名。
*/
private function _saveImage($dstImgName)
{
if(empty($dstImgName)) return false;
$allowImgs = [’.jpg’, ’.jpeg’, ’.png’, ’.bmp’, ’.wbmp’,’.gif’]; //如果目标图片名有后缀就用目标图片扩展名 后缀,如果没有,则用源图的扩展名
$dstExt = strrchr($dstImgName ,".");
$sourseExt = strrchr($this->src ,".");
if(!empty($dstExt)) $dstExt =strtolower($dstExt);
if(!empty($sourseExt)) $sourseExt =strtolower($sourseExt);
//有指定目标名扩展名
if(!empty($dstExt) && in_array($dstExt,$allowImgs)){
$dstName = $dstImgName;
}elseif(!empty($sourseExt) && in_array($sourseExt,$allowImgs)){
$dstName = $dstImgName.$sourseExt;
}else{
$dstName = $dstImgName.$this->imageinfo[’type’];
}
$funcs = "image".$this->imageinfo[’type’];
$funcs($this->image,$dstName);
}
/**
* 销毁图片
*/
public function __destruct(){
imagedestroy($this->image);
}
}
$source = ’123.png’;//原图片名称
$dst_img = ’text.png’;//压缩后图片的名称
$percent = 1; #原图压缩,不缩放,但体积大大降低
$image = (new imgcompress($source,$percent))->compressImg($dst_img);

本文参考出处:http://sylearning.iteye.com/blog/2368860


这个我也用不明白,给$source 图片直连,dst_img空是直接展示图片。也按博客上给点的方法试了。不好用啊。
求懂php的支个招
登录 后可回复!
本类最近热帖
(商家必读)关于调整部分规则和功能的说明 16197
关于开展“净网行动”的通知 12326
关于互站新版解答及心得 7189
各位店主小心!最新互站网买家骗钱招数千万别上当! 3445
关于(2018年9月21日)互站改版升级通知! 1922
被买家恶意差评怎么办 1559
保证金交的多些,对店铺的权重或者搜索排名是否有影响哦~ 1443
互站社区发帖注意事项 1280
买家一直在源码里找bug ,说有bug 要退款 怎么办 1228
互站网发布的源码审核要多久能过啊 1149
本类近期热议
关于开展“净网行动”的通知 122
(商家必读)关于调整部分规则和功能的说明 68
关于(2018年9月21日)互站改版升级通知! 51
关于互站新版解答及心得 39
为什么卖家自动发货的源码安全得不到保障。互站不应该回避 15
给《"违背承诺"处罚规则》提个建议 13
被买家恶意差评怎么办 12
互站现在太多无耻的买家骗源码的,各位注意 11
互站网发布的源码审核要多久能过啊 11
买家一直在源码里找bug ,说有bug 要退款 怎么办 10