php高清晰度无损图片压缩功能的实现代码
微wx笑
2020-05-15【图形图像】
264
7
0关键字:
php 图片压缩
经常会用到把上传的大图片压缩,特别是体积,在微信等APP应用上,也默认都是有压缩的,那么,怎么样对图片大幅度压缩却仍能保持较高的清晰度呢?压缩通常是有按比例缩放,和指定宽度压
经常会用到把上传的大图片压缩,特别是体积,在微信等APP应用上,也默认都是有压缩的,那么,怎么样对图片大幅度压缩却仍能保持较高的清晰度呢?压缩通常是有按比例缩放,和指定宽度压缩的,效果很不错,一个数码相机拍的4M图片,压缩后保持了较高的清晰度和原图宽高值,只有700K。
下面是代码(有两个文件,imgcompress.class.php 类,及compress.php)
compress.php
1 2 3 4 5 6 | <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | <?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); } } |
转自:https://www.jb51.net/article/152371.htm
代码需要完善:判断是否gif动画
1 2 3 4 5 6 7 8 9 10 11 12 | /** * desription 判断是否gif动画 * @param sting $image_file图片路径 * @return boolean t 是 f 否 */ public function check_gifcartoon( $image_file ) { $fp = fopen ( $image_file , 'rb' ); $image_head = fread ( $fp , 1024); fclose( $fp ); return preg_match( "/" . chr (0x21) . chr (0xff) . chr (0x0b) . 'NETSCAPE2.0' . "/" , $image_head ) ? false : true; } |
参考:https://www.cnblogs.com/clubs/p/11911525.html
本文为转载文章,版权归原作者所有,不代表本站立场和观点。