php实现图片压缩处理

这篇文章主要为大家详细介绍了php实现图片压缩处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

本文实例为大家分享了php实现图片压缩处理的具体代码,供大家参考,具体内容如下

说明

在项目中,经常会遇到在前端页面展示用户自己上传的图片,当部分图片尺寸过大,页面图片过多的情况下(如论坛里需要显示用户头像),会引起页面加载缓慢的问题。由于用户图片已存储导数据库,无法改变库里的图片大小,只能在获取图片路径时,压缩图片。

示例

以下函数为图片压缩方法

  1. /**
  2. * 图片压缩处理
  3. * @param string $sFile 图片路径
  4. * @param int $iWidth 自定义图片宽度
  5. * @param int $iHeight 自定义图片高度
  6. */
  7. function getThumb($sFile,$iWidth,$iHeight){
  8. //判断该图片是否存在
  9. if(!file_exists(public_path().$sFile)) return $sFile;
  10. //判断图片格式
  11. $attach_fileext = get_filetype($sFile);
  12. if (!in_array($attach_fileext, array('jpg','png','jpeg'))){
  13. return $sFile;
  14. }
  15. //压缩图片
  16. $sFileNameS = str_replace(".".$attach_fileext, "_".$iWidth.'_'.$iHeight.'.'.$attach_fileext, $sFile);
  17. //判断是否已压缩图片,若是则返回压缩图片路径
  18. if(file_exists(public_path().$sFileNameS)){
  19. return $sFileNameS;
  20. }
  21. //解决手机端上传图片被旋转问题
  22. if (in_array($attach_fileext, array('jpeg')) ){
  23. adjustPicOrientation(public_path().$sFile);
  24. }
  25. //生成压缩图片,并存储到原图同路径下
  26. resizeImage(public_path().$sFile, public_path().$sFileNameS, $iWidth, $iHeight);
  27. if(!file_exists(public_path().$sFileNameS)){
  28. return $sFile;
  29. }
  30. return $sFileNameS;
  31. }
  32. /**
  33. *获取文件后缀名
  34. */
  35. function get_filetype($filename) {
  36. $extend = explode("." , $filename);
  37. return strtolower($extend[count($extend) - 1]);
  38. }
  39. /**
  40. * 解决手机上传图片被旋转问题
  41. * @param string $full_filename 文件路径
  42. */
  43. function adjustPicOrientation($full_filename){
  44. $exif = exif_read_data($full_filename);
  45. if($exif && isset($exif['Orientation'])) {
  46. $orientation = $exif['Orientation'];
  47. if($orientation != 1){
  48. $img = imagecreatefromjpeg($full_filename);
  49. $mirror = false;
  50. $deg = 0;
  51. switch ($orientation) {
  52. case 2:
  53. $mirror = true;
  54. break;
  55. case 3:
  56. $deg = 180;
  57. break;
  58. case 4:
  59. $deg = 180;
  60. $mirror = true;
  61. break;
  62. case 5:
  63. $deg = 270;
  64. $mirror = true;
  65. break;
  66. case 6:
  67. $deg = 270;
  68. break;
  69. case 7:
  70. $deg = 90;
  71. $mirror = true;
  72. break;
  73. case 8:
  74. $deg = 90;
  75. break;
  76. }
  77. if ($deg) $img = imagerotate($img, $deg, 0);
  78. if ($mirror) $img = _mirrorImage($img);
  79. //$full_filename = str_replace('.jpg', "-O$orientation.jpg", $full_filename);新文件名
  80. imagejpeg($img, $full_filename, 95);
  81. }
  82. }
  83. return $full_filename;
  84. }
  85. resizeImage(public_path().$sFile, public_path().$sFileNameS, $iWidth, $iHeight);
  86. /**
  87. * 生成图片
  88. * @param string $im 源图片路径
  89. * @param string $dest 目标图片路径
  90. * @param int $maxwidth 生成图片宽
  91. * @param int $maxheight 生成图片高
  92. */
  93. function resizeImage($im, $dest, $maxwidth, $maxheight) {
  94. $img = getimagesize($im);
  95. switch ($img[2]) {
  96. case 1:
  97. $im = @imagecreatefromgif($im);
  98. break;
  99. case 2:
  100. $im = @imagecreatefromjpeg($im);
  101. break;
  102. case 3:
  103. $im = @imagecreatefrompng($im);
  104. break;
  105. }
  106. $pic_width = imagesx($im);
  107. $pic_height = imagesy($im);
  108. $resizewidth_tag = false;
  109. $resizeheight_tag = false;
  110. if (($maxwidth && $pic_width > $maxwidth) || ($maxheight && $pic_height > $maxheight)) {
  111. if ($maxwidth && $pic_width > $maxwidth) {
  112. $widthratio = $maxwidth / $pic_width;
  113. $resizewidth_tag = true;
  114. }
  115. if ($maxheight && $pic_height > $maxheight) {
  116. $heightratio = $maxheight / $pic_height;
  117. $resizeheight_tag = true;
  118. }
  119. if ($resizewidth_tag && $resizeheight_tag) {
  120. if ($widthratio < $heightratio)
  121. $ratio = $widthratio;
  122. else
  123. $ratio = $heightratio;
  124. }
  125. if ($resizewidth_tag && !$resizeheight_tag)
  126. $ratio = $widthratio;
  127. if ($resizeheight_tag && !$resizewidth_tag)
  128. $ratio = $heightratio;
  129. $newwidth = $pic_width * $ratio;
  130. $newheight = $pic_height * $ratio;
  131. if (function_exists("imagecopyresampled")) {
  132. $newim = imagecreatetruecolor($newwidth, $newheight);
  133. imagecopyresampled($newim, $im, 0, 0, 0, 0, $newwidth, $newheight, $pic_width, $pic_height);
  134. } else {
  135. $newim = imagecreate($newwidth, $newheight);
  136. imagecopyresized($newim, $im, 0, 0, 0, 0, $newwidth, $newheight, $pic_width, $pic_height);
  137. }
  138. imagejpeg($newim, $dest);
  139. imagedestroy($newim);
  140. } else {
  141. imagejpeg($im, $dest);
  142. }
  143. }