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> <groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId> <artifactId>okhttp</artifactId>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.20</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

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