perf: 优化图片压缩

This commit is contained in:
kuaifan
2023-06-15 17:25:25 +08:00
parent fd33eb3d1c
commit 29bbbd804a
12 changed files with 310 additions and 326 deletions
+42 -137
View File
@@ -2128,11 +2128,11 @@ class Base
if ($param['scale'] && is_array($param['scale'])) {
list($width, $height) = $param['scale'];
if (($width > 0 && $array['width'] > $width) || ($height > 0 && $array['height'] > $height)) {
$cut = ($width > 0 && $height > 0) ? 1 : -1;
$cut = ($width > 0 && $height > 0) ? 'cover' : 'percentage';
$cut = $param['scale'][2] ?? $cut;
//图片压缩
$tmpFile = $array['file'] . '_tmp.jpg';
if (Base::imgThumb($array['file'], $tmpFile, $width, $height, $cut)) {
if (Image::thumbImage($array['file'], $tmpFile, $width, $height, $cut)) {
$tmpSize = filesize($tmpFile);
if ($tmpSize > $fileSize) {
@unlink($tmpFile);
@@ -2158,7 +2158,7 @@ class Base
}
// 压缩图片
if ($param['compress'] !== false) {
ImgCompress::compress($array['file']);
Image::compressImage($array['file']);
$array['size'] = Base::twoFloat(filesize($array['file']) / 1024, true);
}
//生成缩略图
@@ -2167,8 +2167,8 @@ class Base
$param['autoThumb'] = false;
}
if ($param['autoThumb'] !== false) {
if (Base::imgThumb($array['file'], $array['file'] . "_thumb.jpg", 320, 0)) {
$array['thumb'] .= "_thumb.jpg";
if ($extension = Image::thumbImage($array['file'], $array['file'] . "_thumb.{*}", 320, 0)) {
$array['thumb'] .= "_thumb.{$extension}";
}
}
$array['thumb'] = Base::fillUrl($array['thumb']);
@@ -2312,11 +2312,11 @@ class Base
if ($param['scale'] && is_array($param['scale'])) {
list($width, $height) = $param['scale'];
if (($width > 0 && $array['width'] > $width) || ($height > 0 && $array['height'] > $height)) {
$cut = ($width > 0 && $height > 0) ? 1 : -1;
$cut = ($width > 0 && $height > 0) ? 'cover' : 'percentage';
$cut = $param['scale'][2] ?? $cut;
//图片压缩
$tmpFile = $array['file'] . '_tmp.jpg';
if (Base::imgThumb($array['file'], $tmpFile, $width, $height, $cut)) {
if (Image::thumbImage($array['file'], $tmpFile, $width, $height, $cut)) {
$tmpSize = filesize($tmpFile);
if ($tmpSize > $fileSize) {
@unlink($tmpFile);
@@ -2346,15 +2346,15 @@ class Base
$param['autoThumb'] = false;
}
if ($param['autoThumb'] !== false) {
if (Base::imgThumb($array['file'], $array['file'] . "_thumb.jpg", 320, 0)) {
$array['thumb'] .= "_thumb.jpg";
if ($extension = Image::thumbImage($array['file'], $array['file'] . "_thumb.{*}", 320, 0)) {
$array['thumb'] .= "_thumb.{$extension}";
}
}
$array['thumb'] = Base::fillUrl($array['thumb']);
}
// 压缩图片
if ($param['compress'] !== false) {
ImgCompress::compress($array['file']);
Image::compressImage($array['file']);
$array['size'] = Base::twoFloat(filesize($array['file']) / 1024, true);
}
//
@@ -2396,141 +2396,46 @@ class Base
}
/**
* 生成缩略图
* @param string $src_img 源图绝对完整地址{带文件名及后缀名}
* @param string $dst_img 目标图绝对完整地址{带文件名及后缀名}
* @param int $width 缩略图宽{0:此时目标高度不能为0,目标宽度为源图宽*(目标高度/源图高)}
* @param int $height 缩略图高{0:此时目标宽度不能为0,目标高度为源图高*(目标宽度/源图宽)}
* @param int $cut 是否裁切{宽,高必须非0}:1是、0否、-1或'auto'保持等比
* @param int $proportion 缩放{0:不缩放, 0<this<1:缩放到相应比例(此时宽高限制和裁切均失效)}
* 是否缩略图
* @param $file
* @return bool
*/
public static function imgThumb($src_img, $dst_img, $width = 75, $height = 75, $cut = 0, $proportion = 0)
public static function isThumb($file): bool
{
if (!is_file($src_img)) {
return false;
}
if (empty($dst_img)) {
$dst_img = $src_img;
}
$st = pathinfo($src_img, PATHINFO_EXTENSION);
if (!in_array(strtolower($st), array('jpg', 'jpeg', 'webp', 'png', 'gif', 'bmp'))) {
return false;
}
$ot = pathinfo($dst_img, PATHINFO_EXTENSION);
$otfunc = 'image' . ($ot == 'jpg' ? 'jpeg' : $ot);
$srcinfo = getimagesize($src_img);
$src_w = $srcinfo[0];
$src_h = $srcinfo[1];
$type = strtolower(substr(image_type_to_extension($srcinfo[2]), 1));
if (empty($type)) {
return false;
}
$createfun = 'imagecreatefrom' . ($type == 'jpg' ? 'jpeg' : $type);
return str_ends_with($file, '_thumb.jpg')
|| str_ends_with($file, '_thumb.png');
}
$dst_h = $height;
$dst_w = $width;
$x = $y = 0;
/**
* 缩略图不超过源图尺寸(前提是宽或高只有一个)
*/
if (($width > $src_w && $height > $src_h) || ($height > $src_h && $width == 0) || ($width > $src_w && $height == 0)) {
$proportion = 1;
}
if ($width > $src_w) {
$dst_w = $width = $src_w;
}
if ($height > $src_h) {
$dst_h = $height = $src_h;
}
if (!$width && !$height && !$proportion) {
return false;
}
if (!$proportion) {
if ($cut == 'auto' || $cut == -1) {
if ($dst_w && $dst_h) {
$wB = $dst_w / $src_w;
$hB = $dst_h / $src_h;
if ($wB > $hB) {
$dst_w = 0;
} else {
$dst_h = 0;
}
}
$cut = 0;
}
if ($cut == 0) {
if ($dst_w && $dst_h) {
if ($dst_w / $src_w > $dst_h / $src_h) {
$dst_w = $src_w * ($dst_h / $src_h);
$x = 0 - ($dst_w - $width) / 2;
} else {
$dst_h = $src_h * ($dst_w / $src_w);
$y = 0 - ($dst_h - $height) / 2;
}
} else if ($dst_w xor $dst_h) {
if ($dst_w && !$dst_h) //有宽无高
{
$propor = $dst_w / $src_w;
$height = $dst_h = $src_h * $propor;
} else if (!$dst_w && $dst_h) //有高无宽
{
$propor = $dst_h / $src_h;
$width = $dst_w = $src_w * $propor;
}
}
} else {
if (!$dst_h) //裁剪时无高
{
$height = $dst_h = $dst_w;
}
if (!$dst_w) //裁剪时无宽
{
$width = $dst_w = $dst_h;
}
$propor = min(max($dst_w / $src_w, $dst_h / $src_h), 1);
$dst_w = (int)round($src_w * $propor);
$dst_h = (int)round($src_h * $propor);
$x = ($width - $dst_w) / 2;
$y = ($height - $dst_h) / 2;
}
/**
* 获取缩略图后缀
* @param $file
* @return string
*/
public static function getThumbExt($file): string
{
if (file_exists($file . '_thumb.jpg')) {
return 'jpg';
} elseif (file_exists($file . '_thumb.png')) {
return 'png';
} else {
$proportion = min($proportion, 1);
$height = $dst_h = $src_h * $proportion;
$width = $dst_w = $src_w * $proportion;
return '';
}
}
if (!function_exists($createfun)) {
return false;
}
$src = $createfun($src_img);
$dst = imagecreatetruecolor($width ?: $dst_w, $height ?: $dst_h);
if (function_exists('imagecopyresampled')) {
imagecopyresampled($dst, $src, $x, $y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
/**
* 缩略图还原
* @param $file
* @return mixed|string
*/
public static function thumbRestore($file): mixed
{
if (str_ends_with($file, '_thumb.jpg')) {
return Base::rightDelete($file, '_thumb.jpg');
} elseif (str_ends_with($file, '_thumb.png')) {
return Base::rightDelete($file, '_thumb.png');
} else {
imagecopyresized($dst, $src, $x, $y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
return $file;
}
try {
if ($type == 'png') {
imagesavealpha($dst, true);
$transparent = imagecolorallocatealpha($dst, 0, 0, 0, 127);
imagefill($dst, 0, 0, $transparent);
} else {
$white = imagecolorallocate($dst, 255, 255, 255);
imagefill($dst, 0, 0, $white);
}
} catch (\Throwable) {
}
$otfunc($dst, $dst_img);
imagedestroy($dst);
imagedestroy($src);
return true;
}
/**
@@ -2986,7 +2891,7 @@ class Base
public static function saveContentImage($path, $content, $compress = true) {
if (file_put_contents($path, $content)) {
if ($compress) {
ImgCompress::compress($path);
Image::compressImage($path);
}
return true;
}