php图片无损压缩的问题解决(推荐)
代码如下
1 <?php 2 3 namespace App\Contract; 4 5 use Carbon\Carbon; 6 7 /** 8 * 图片压缩封装类 9 * @author jackie <2019.11.20> 10 */ 11 class CompressImageContract 12 { 13 /** 14 * desription 压缩图片 15 * @param sting $imgsrc 图片路径(服務器絕對路徑) 16 * @param string $imgdst 压缩后保存路径(服務器絕對路徑) 17 */ 18 public function image_png_size_add($imgsrc, $imgdst) 19 { 20 $zip_width = config("config.zip_width");//讀取默認最小寬度 21 $zip_height = config("config.zip_height");//讀取默認最小高度 22 $zip_per = config("config.zip_per");//讀取默認壓縮比例 23 24 list($width, $height, $type) = getimagesize($imgsrc); 25 $new_width = ceil(($width > 600 ? 600 : $width) * $zip_per); 26 $new_height = ceil(($height > 600 ? 600 : $height) * $zip_per); 27 /*$width = 3000; 28 $height = 150; 29 $new_width = $width * $zip_per; 30 $new_height = $height * $zip_per;*/ 31 32 //寬度、高度都小於最小值,取最大比例值 33 if ($new_width < $zip_width && $new_height < $zip_height) { 34 $formatWidth = sprintf("%.1f", $zip_width / $width); 35 $perWidth = $formatWidth + 0.1; 36 37 $formatHeight = sprintf("%.1f", $zip_height / $height); 38 $perHeight = $formatHeight + 0.1; 39 40 $per = $perWidth >= $perHeight ? $perWidth : $perHeight; 41 $per = $per < 1 ? $per : 1;//壓縮比例不能大於1 42 $new_width = ceil($width * $per); 43 $new_height = ceil($height * $per); 44 //return $new_width.'/'.$new_height.$per.'/**1'; 45 } 46 47 //寬度小於最小值,高度正常,計算寬度最小比例 48 if ($new_width < $zip_width && $new_height > $zip_height) { 49 $formatWidth = sprintf("%.1f", $zip_width / $width); 50 $per = $formatWidth + 0.1; 51 $per = $per < 1 ? $per : 1;//壓縮比例不能大於1 52 $new_width = ceil($width * $per); 53 $new_height = ceil($height * $per); 54 //return $new_width . '/' . $new_height . '/' . $per . '/**2'; 55 } 56 //寬度正常,高度小於最小值,計算高度最小比例 57 if ($new_width > $zip_width && $new_height < $zip_height) { 58 $formatHeight = sprintf("%.1f", $zip_height / $height); 59 $per = $formatHeight + 0.1; 60 $per = $per < 1 ? $per : 1;//壓縮比例不能大於1 61 $new_width = ceil($width * $per); 62 $new_height = ceil($height * $per); 63 //return $new_width . '/' . $new_height . '/' . $per . '/**3'; 64 } 65 //return $new_width . '/' . $new_height . '/' . $per . '/**4'; 66 67 switch ($type) { 68 case 1: 69 $giftype = $this->check_gifcartoon($imgsrc); 70 if ($giftype) { 71 header('Content-Type:image/gif'); 72 $image_wp = imagecreatetruecolor($new_width, $new_height); 73 $image = imagecreatefromgif($imgsrc); 74 imagecopyresampled($image_wp, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); 75 imagejpeg($image_wp, $imgdst, 75); 76 imagedestroy($image_wp); 77 } 78 break; 79 case 2: 80 header('Content-Type:image/jpeg'); 81 $image_wp = imagecreatetruecolor($new_width, $new_height); 82 $image = imagecreatefromjpeg($imgsrc); 83 imagecopyresampled($image_wp, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); 84 imagejpeg($image_wp, $imgdst, 75); 85 imagedestroy($image_wp); 86 break; 87 case 3: 88 header('Content-Type:image/png'); 89 $image_wp = imagecreatetruecolor($new_width, $new_height); 90 $image = imagecreatefrompng($imgsrc); 91 imagecopyresampled($image_wp, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); 92 imagejpeg($image_wp, $imgdst, 75); 93 imagedestroy($image_wp); 94 break; 95 } 96 } 97 98 /** 99 * desription 判断是否gif动画 100 * @param sting $image_file图片路径 101 * @return boolean t 是 f 否 102 */ 103 public function check_gifcartoon($image_file) 104 { 105 $content = file_get_contents($image_file); 106 if (preg_match("/" . chr(0x21) . chr(0xff) . chr(0x0b) . 'NETSCAPE2.0' . "/", $content)) { 107 return true; 108 } else { 109 return false; 110 } 111 } 112 }