feat(randomphoto): 优化图片下载和压缩功能

- 新增 ImageUtil 类,提供图片下载和压缩工具方法
- 重构 RandomPhotoService 类,使用新的 ImageUtil工具类处理图片
- 添加 thumbnailator 依赖,用于图片压缩处理
This commit is contained in:
Grand-cocoa 2024-12-11 15:52:03 +08:00
parent fbfb1c1a7f
commit 4f8e447bdd
3 changed files with 57 additions and 5 deletions

View File

@ -142,6 +142,12 @@
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.20</version>
</dependency>
</dependencies>
<build>

View File

@ -5,14 +5,13 @@ import info.alinadace.sakuramiki.annotation.BotFunction
import info.alinadace.sakuramiki.service.Service
import info.alinadace.sakuramiki.service.randomphoto.domain.FileList
import info.alinadace.sakuramiki.service.randomphoto.domain.SingleFile
import info.alinadace.sakuramiki.util.okHttpClient
import info.alinadace.sakuramiki.util.ImageUtil
import io.github.kloping.qqbot.api.v2.FriendMessageEvent
import io.github.kloping.qqbot.api.v2.GroupMessageEvent
import io.github.kloping.qqbot.api.v2.MessageV2Event
import io.github.kloping.qqbot.entities.ex.Image
import io.github.kloping.qqbot.entities.ex.PlainText
import jakarta.annotation.Resource
import okhttp3.Request
/**
* @author Kane
@ -57,13 +56,13 @@ class RandomPhotoService : Service<MessageV2Event> {
return
}
event.send("图片下载中...")
val request = Request.Builder().get().url(file.data.rawURL).build()
val imageByte = okHttpClient.newCall(request).execute().body?.bytes();
val imageByte = ImageUtil.download(file.data.rawURL)
if (imageByte == null) {
event.send("图片下载失败")
return
}
val image = Image(imageByte)
val compression = ImageUtil.compression(imageByte)
val image = Image(compression)
event.send(image)
}
}

View File

@ -0,0 +1,47 @@
package info.alinadace.sakuramiki.util
import net.coobird.thumbnailator.Thumbnails
import okhttp3.Request
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
/**
* @author Kane
* @since 2024/11/13 11:39
*/
class ImageUtil {
companion object {
private const val MAX_SIZE = 1024 * 1024
fun compression(bytes: ByteArray): ByteArray {
val size = bytes.size
var ratio = if (size > MAX_SIZE) {
MAX_SIZE.toFloat() / size
} else {
return bytes
}
if (ratio > 0.11f) {
ratio -= 0.1f
}
val inputStream = ByteArrayInputStream(bytes)
val outputStream = ByteArrayOutputStream()
try {
Thumbnails.of(inputStream)
.width(1920)
.height(1080)
.scale(1.0)
.outputQuality(ratio) // 设置压缩质量,范围从 0.0 到 1.0
.toOutputStream(outputStream)
} catch (e: Exception) {
e.printStackTrace()
}
return outputStream.toByteArray()
}
fun download(url: String): ByteArray? {
val request = Request.Builder().get().url(url).build()
return okHttpClient.newCall(request).execute().body?.bytes();
}
}
}