Browse Source

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

master
wanghongjun 5 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;
// 压缩图地址
// 处理图地址
$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) {
return '';
}
return $compress_path;
}
/**
* 使用Imagick压缩到5x5像素
* @param $source
* @param $target
* @return bool
*/
protected function compressTo5x5($source, $target)
// 使用Imagick添加轻微模糊
protected function slightBlurImagick($source, $target, $blurLevel)
{
try {
$imagick = new \Imagick($source);
// 轻微模糊 (半径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)
{
// 获取图片信息
list($width, $height, $type) = getimagesize($source);
$info = getimagesize($source);
$type = $info[2];
// 根据类型创建图像资源
// 创建图像资源
switch ($type) {
case IMAGETYPE_JPEG:
$image = imagecreatefromjpeg($source);
@ -451,40 +482,35 @@ class Upload extends BaseController
case IMAGETYPE_GIF:
$image = imagecreatefromgif($source);
break;
case IMAGETYPE_WEBP:
$image = imagecreatefromwebp($source);
break;
default:
return false;
}
// 创建5x5目标图像
$thumb = imagecreatetruecolor($width, $height);
// 处理透明背景
if ($type == IMAGETYPE_PNG || $type == IMAGETYPE_GIF) {
imagecolortransparent($thumb, imagecolorallocatealpha($thumb, 0, 0, 0, 127));
imagealphablending($thumb, false);
imagesavealpha($thumb, true);
// 应用轻微模糊
for ($i = 0; $i < $blurLevel; $i++) {
imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);
}
// 缩放并复制图像
imagecopyresampled($thumb, $image, 0, 0, 0, 0, $width, $height, $width, $height);
// 保存压缩后的图片
// 保存图片
switch ($type) {
case IMAGETYPE_JPEG:
imagejpeg($thumb, $target, 40);
imagejpeg($image, $target, 85);
break;
case IMAGETYPE_PNG:
imagepng($thumb, $target, 40);
imagepng($image, $target, 8);
break;
case IMAGETYPE_GIF:
imagegif($thumb, $target);
imagegif($image, $target);
break;
case IMAGETYPE_WEBP:
imagewebp($image, $target, 85);
break;
}
// 释放内存
imagedestroy($image);
imagedestroy($thumb);
return true;
}
}

Loading…
Cancel
Save