From 7d11acfe18d93b8563fdba535b5fb017cbfd7f6e Mon Sep 17 00:00:00 2001 From: filesite Date: Mon, 12 Aug 2024 11:37:48 +0800 Subject: [PATCH] add small jpg generator in php --- themes/beauty/controller/SiteController.php | 88 ++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/themes/beauty/controller/SiteController.php b/themes/beauty/controller/SiteController.php index 7871818..52aec98 100644 --- a/themes/beauty/controller/SiteController.php +++ b/themes/beauty/controller/SiteController.php @@ -366,6 +366,72 @@ Class SiteController extends Controller { return $this->renderJson(compact('code', 'msg')); } + //借助gd库,获取图片类型、尺寸,并实时生成缩略图 + protected function createSmallJpg($img_filepath, $min_width = 198, $min_height = 219, $max_width = 600, $max_height = 500) { + $img_data = null; + + try { + list($naturalWidth, $naturalHeight, $imgTypeIndex, $style) = getimagesize($img_filepath); + $imgType = image_type_to_extension($imgTypeIndex); + + //生成同比例缩略图尺寸 + $width = $min_width; + $height = $min_height; + $aspect = $naturalHeight / $naturalWidth; + if ($naturalWidth <= $naturalHeight) { + $width = $width * 2.5 <= $max_width ? (int)($width * 2.5) : $max_width; + $height = (int)($width * $aspect); + }else { + $height = $height * 2.5 <= $max_height ? (int)($height * 2.5) : $max_height; + $width = (int)($height / $aspect); + } + + $imgSource = null; + switch ($imgType) { + case '.jpeg': + $imgSource = imagecreatefromjpeg($img_filepath); + break; + case '.png': + $imgSource = imagecreatefrompng($img_filepath); + break; + case '.gif': + $imgSource = imagecreatefromgif($img_filepath); + break; + case '.webp': + //php >= 5.4 + if (phpversion() >= 5.4) { + $imgSource = imagecreatefromwebp($img_filepath); + } + break; + case '.bmp': + //php >= 7.2 + if (phpversion() >= 7.2) { + $imgSource = imagecreatefrombmp($img_filepath); + } + break; + } + + //保存base64格式的缩略图到缓存文件 + if (!empty($imgSource)) { + $dst_img = imagecreatetruecolor($width, $height); + $copy_done = imagecopyresized($dst_img, $imgSource, 0, 0, 0, 0, $width, $height, $naturalWidth, $naturalHeight); + + if ($copy_done) { + ob_start(); + imagejpeg($dst_img); + $img_data = ob_get_clean(); + ob_end_clean(); + } + + imagedestroy($dst_img); + } + }catch(Exception $e) { + $this->logError('创建缩略图失败:' . $e->getMessage()); + } + + return $img_data; + } + //优先从缓存获取小尺寸的图片 //增加父目录封面图缓存更新 public function actionSmallimg() { @@ -379,7 +445,27 @@ Class SiteController extends Controller { $expireSeconds = FSC::$app['config']['screenshot_expire_seconds']; //有效期3650天 $cacheSubDir = 'image'; $cachedData = Common::getCacheFromFile($cacheKey, $expireSeconds, $cacheSubDir); - if (!empty($cachedData)) { + + //无缓存,则实时生成缩略图 + if (empty($cachedData)) { + $tmpUrl = parse_url($imgUrl); + $img_filepath = __DIR__ . '/../../../www' . $tmpUrl['path']; + $img_data = $this->createSmallJpg($img_filepath); + if (!empty($img_data)) { + //保存到缓存文件 + $cacheKey = $this->getCacheKey($imgId, 'imgsm'); + $cacheSubDir = 'image'; + $base64_img = base64_encode($img_data); + Common::saveCacheToFile($cacheKey, "data:image/jpeg;base64,{$base64_img}", $cacheSubDir); + + //返回图片数据 + header("Content-Type: image/jpeg"); + header('Cache-Control: max-age=3600'); //缓存 1 小时 + header("Etag: " . md5($img_data)); + echo $img_data; + exit; + } + }else { //有缓存,则返回缓存数据 $imgType = preg_replace('/^data:(image\/.+);base64,.+$/i', "$1", $cachedData); $base64_img = preg_replace('/^data:image\/.+;base64,/i', '', $cachedData);