Kaynağa Gözat

更新缩略图生成逻辑,添加缩放参数支持;修改生成路径以包含缩放信息

xiaoyelj 5 ay önce
ebeveyn
işleme
0dd9921eaa

+ 3 - 2
src/main/kotlin/com/yujin/thumbnail/controller/ThumbnailController.kt

@@ -24,14 +24,15 @@ class ThumbnailController {
     fun generateThumbnail(
         @Param("w") w: Int = 200,
         @Param("h") h: Int = 200,
+        @Param("s", defaultValue = "1.0") s: Double = 1.0,
         @Param("t") t: String = "1",
     ) {
         val path = Context.current().path().substring("/api/thumbnail".length)
-        logger.info("请求参数: 路径=${path}, 尺寸=${w}x${h}_${t}") // 验证参数
+        logger.info("请求参数: 路径=${path}, 尺寸=${w}x${h}_${s}_${t}") // 验证参数
         require(path.isNotBlank()) { "文件路径不能为空" }
         require(w > 0 && w <= 4000) { "宽度必须在1-4000像素之间" }
         require(h > 0 && h <= 4000) { "高度必须在1-4000像素之间" } // 直接将缩略图写入响应流
-        thumbnailService.generateThumbnailToStream(path, w, h,t)
+        thumbnailService.generateThumbnailToStream(path, w, h, s, t)
         logger.info("缩略图生成并输出成功")
 
     }

+ 19 - 14
src/main/kotlin/com/yujin/thumbnail/service/ThumbnailService.kt

@@ -34,11 +34,11 @@ class ThumbnailService {
      * @param width 目标宽度
      * @param height 目标高度
      */
-    fun generateThumbnailToStream(relativePath: String, width: Int, height: Int, type: String) { // 构建完整的文件路径
+    fun generateThumbnailToStream(relativePath: String, width: Int, height: Int, scale: Double, type: String) { // 构建完整的文件路径
         val fullPath = filePrefix + relativePath
 
         // 构建缩略图文件路径
-        val thumbnailPath = buildThumbnailPath(fullPath, width, height, type)
+        val thumbnailPath = buildThumbnailPath(fullPath, width, height, scale, type)
         val thumbnailFile = File(thumbnailPath)
 
         // 如果缩略图已存在,直接复制到输出流
@@ -49,17 +49,18 @@ class ThumbnailService {
             // 使用配置的质量生成缩略图
             val thumbnailBuilder = Thumbnails.of(URL("${minioBaseUrl}${relativePath}")).apply {
                 when (type) {
-                    "1" -> this.sourceRegion(Positions.CENTER, width, height)
-                    "2" -> this.sourceRegion(Positions.TOP_LEFT, width, height)
-                    "3" -> this.sourceRegion(Positions.TOP_CENTER, width, height)
-                    "4" -> this.sourceRegion(Positions.TOP_RIGHT, width, height)
-                    "5" -> this.sourceRegion(Positions.CENTER_LEFT, width, height)
-                    "6" -> this.sourceRegion(Positions.CENTER_RIGHT, width, height)
-                    "7" -> this.sourceRegion(Positions.BOTTOM_LEFT, width, height)
-                    "8" -> this.sourceRegion(Positions.BOTTOM_CENTER, width, height)
-                    "9" -> this.sourceRegion(Positions.BOTTOM_RIGHT, width, height)
+                    "1" -> this.sourceRegion(Positions.CENTER, width, height).size(width, height).outputFormat("jpg").outputQuality(quality!!)
+                    "2" -> this.sourceRegion(Positions.TOP_LEFT, width, height).size(width, height).outputFormat("jpg").outputQuality(quality!!)
+                    "3" -> this.sourceRegion(Positions.TOP_CENTER, width, height).size(width, height).outputFormat("jpg").outputQuality(quality!!)
+                    "4" -> this.sourceRegion(Positions.TOP_RIGHT, width, height).size(width, height).outputFormat("jpg").outputQuality(quality!!)
+                    "5" -> this.sourceRegion(Positions.CENTER_LEFT, width, height).size(width, height).outputFormat("jpg").outputQuality(quality!!)
+                    "6" -> this.sourceRegion(Positions.CENTER_RIGHT, width, height).size(width, height).outputFormat("jpg").outputQuality(quality!!)
+                    "7" -> this.sourceRegion(Positions.BOTTOM_LEFT, width, height).size(width, height).outputFormat("jpg").outputQuality(quality!!)
+                    "8" -> this.sourceRegion(Positions.BOTTOM_CENTER, width, height).size(width, height).outputFormat("jpg").outputQuality(quality!!)
+                    "9" -> this.sourceRegion(Positions.BOTTOM_RIGHT, width, height).size(width, height).outputFormat("jpg").outputQuality(quality!!)
+                    "10" -> this.scale(scale).outputFormat("jpg").outputQuality(quality!!)
                 }
-            }.size(width, height).outputFormat("jpg").outputQuality(quality!!) // 先保存到文件(用于缓存)
+            }
             thumbnailBuilder.toFile(thumbnailFile)
         }
         val context = Context.current()
@@ -70,13 +71,17 @@ class ThumbnailService {
     }
 
 
-    private fun buildThumbnailPath(originalPath: String, width: Int, height: Int, type: String): String {
+    private fun buildThumbnailPath(originalPath: String, width: Int, height: Int, scale: Double, type: String): String {
         val file = File(originalPath)
         val directory = file.parent
         val nameWithoutExt = file.nameWithoutExtension
         val extension = "jpg"  // 固定为jpg格式
 
-        val thumbnailName = "${nameWithoutExt}_${width}_${height}_${type}.${extension}"
+        val thumbnailName =
+            when (type) {
+                "10" -> "${nameWithoutExt}_${scale}_${type}.${extension}"
+                else -> "${nameWithoutExt}_${width}_${height}_${type}.${extension}"
+            }
         return File(directory, thumbnailName).absolutePath
     }