加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php高清晰度无损图片压缩功能的实现代码

发布时间:2020-12-13 05:18:31 所属栏目:PHP教程 来源:网络整理
导读:经常会用到把上传的大图片压缩,特别是体积,在微信等APP应用上,也默认都是有压缩的,那么,怎么样对图片大幅度压缩却仍能保持较高的清晰度呢? 压缩通常是有按比例缩放,和指定宽度压缩的,效果很不错,一个数码相机拍的4M图片,压缩后保持了较高的清晰度

经常会用到把上传的大图片压缩,特别是体积,在微信等APP应用上,也默认都是有压缩的,那么,怎么样对图片大幅度压缩却仍能保持较高的清晰度呢?

压缩通常是有按比例缩放,和指定宽度压缩的,效果很不错,一个数码相机拍的4M图片,压缩后保持了较高的清晰度和原图宽高值,只有700K。

下面是代码(有两个文件,imgcompress.class.php 类,及compress.php)

compress.php

require_once 'imgcompress.class.php';

$source = 'test.png';//原图文件名

$dst_img = 'test_.png';//保存图片的文件名

$percent = ; #原图压缩,不缩放,但体积大大降低

$image = (new imgcompress($source,$percent))->compressImg($dst_img);

imgcompress.class.php

/**

* 图片压缩类:通过缩放来压缩。

* 如果要保持源图比例,把参数$percent保持为即可。

* 即使原比例压缩,也可大幅度缩小。数码相机M图片。也可以缩为KB左右。如果缩小比例,则体积会更小。

*

* 结果:可保存、可直接显示。

*/

class imgcompress{

private $src;

private $image;

private $imageinfo;

private $percent = .;

/**

* 图片压缩

* @param $src 源图

* @param float $percent 压缩比例

*/

public function __construct($src,$percent=)

{

$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,$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 、可指定字符串不带后缀的名称,使用源图扩展名 。、直接指定目标图片名带扩展名。

*/

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);

}

}

使用之后个人感觉 $percent 设置为0.5 左右就不错了,压缩后的图片与原图质量基本一样。


总结

以上所述是小编给大家介绍的php高清晰度无损图片压缩功能的实现代码。编程之家 52php.cn 收集整理的教程希望能对你有所帮助,如果觉得编程之家不错,可分享给好友!感谢支持。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读