Browse Source

聊天上传图片压缩,新增返回原图接口4

master
wanghongjun 8 months ago
parent
commit
db0c814655
  1. 88
      app/common/controller/Upload.php

88
app/common/controller/Upload.php

@ -419,28 +419,59 @@ class Upload extends BaseController
} }
// 原图地址 // 原图地址
$filePath = root_path().'public' . $src; $filePath = root_path().'public' . $src;
// 压缩图地址 // 处理图地址
$target = root_path().'public/' .ltrim($compress_path,'/'); $target = root_path().'public/' .ltrim($compress_path,'/');
// 压缩并处理图片大小 // 图片模糊处理
$compress_res = $this->compressTo5x5($filePath, $target); if (class_exists('Imagick')) {
$compress_res = $this->slightBlurImagick($filePath, $target, 1);
} else {
$compress_res = $this->slightBlurGD($filePath, $target, 1);
}
if (!$compress_res) { if (!$compress_res) {
return ''; return '';
} }
return $compress_path; return $compress_path;
} }
/** // 使用Imagick添加轻微模糊
* 使用Imagick压缩到5x5像素 protected function slightBlurImagick($source, $target, $blurLevel)
* @param $source {
* @param $target try {
* @return bool $imagick = new \Imagick($source);
*/
protected function compressTo5x5($source, $target) // 轻微模糊 (半径0.5-2.0)
$radius = min(2.0, max(0.5, $blurLevel * 0.5));
$imagick->gaussianBlurImage($radius, 1);
// 保存时降低质量
$extension = strtolower(pathinfo($target, PATHINFO_EXTENSION));
switch ($extension) {
case 'jpg':
case 'jpeg':
$imagick->setImageCompressionQuality(85);
$imagick->setImageFormat('jpeg');
break;
case 'webp':
case 'png':
$imagick->setImageCompressionQuality(85);
break;
}
return $imagick->writeImage($target);
} catch (\Exception $e) {
\think\facade\Log::error('Imagick模糊处理失败: ' . $e->getMessage());
return false;
}
}
// 使用GD库添加轻微模糊
protected function slightBlurGD($source, $target, $blurLevel)
{ {
// 获取图片信息 $info = getimagesize($source);
list($width, $height, $type) = getimagesize($source); $type = $info[2];
// 根据类型创建图像资源 // 创建图像资源
switch ($type) { switch ($type) {
case IMAGETYPE_JPEG: case IMAGETYPE_JPEG:
$image = imagecreatefromjpeg($source); $image = imagecreatefromjpeg($source);
@ -451,40 +482,35 @@ class Upload extends BaseController
case IMAGETYPE_GIF: case IMAGETYPE_GIF:
$image = imagecreatefromgif($source); $image = imagecreatefromgif($source);
break; break;
case IMAGETYPE_WEBP:
$image = imagecreatefromwebp($source);
break;
default: default:
return false; return false;
} }
// 创建5x5目标图像 // 应用轻微模糊
$thumb = imagecreatetruecolor($width, $height); for ($i = 0; $i < $blurLevel; $i++) {
imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);
// 处理透明背景
if ($type == IMAGETYPE_PNG || $type == IMAGETYPE_GIF) {
imagecolortransparent($thumb, imagecolorallocatealpha($thumb, 0, 0, 0, 127));
imagealphablending($thumb, false);
imagesavealpha($thumb, true);
} }
// 缩放并复制图像 // 保存图片
imagecopyresampled($thumb, $image, 0, 0, 0, 0, $width, $height, $width, $height);
// 保存压缩后的图片
switch ($type) { switch ($type) {
case IMAGETYPE_JPEG: case IMAGETYPE_JPEG:
imagejpeg($thumb, $target, 40); imagejpeg($image, $target, 85);
break; break;
case IMAGETYPE_PNG: case IMAGETYPE_PNG:
imagepng($thumb, $target, 40); imagepng($image, $target, 8);
break; break;
case IMAGETYPE_GIF: case IMAGETYPE_GIF:
imagegif($thumb, $target); imagegif($image, $target);
break;
case IMAGETYPE_WEBP:
imagewebp($image, $target, 85);
break; break;
} }
// 释放内存
imagedestroy($image); imagedestroy($image);
imagedestroy($thumb);
return true; return true;
} }
} }

Loading…
Cancel
Save