Browse Source

add small jpg generator in php

master
filesite 4 months ago
parent
commit
7d11acfe18
  1. 88
      themes/beauty/controller/SiteController.php

88
themes/beauty/controller/SiteController.php

@ -366,6 +366,72 @@ Class SiteController extends Controller { @@ -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 { @@ -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);

Loading…
Cancel
Save