From 4f8e447bdda217dc6144661b33af72199fa86b85 Mon Sep 17 00:00:00 2001 From: Grand-cocoa <1075576561@qq.com49111108+grand-cocoa@users.noreply.github.com> Date: Wed, 11 Dec 2024 15:52:03 +0800 Subject: [PATCH] =?UTF-8?q?feat(randomphoto):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E4=B8=8B=E8=BD=BD=E5=92=8C=E5=8E=8B=E7=BC=A9?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 ImageUtil 类,提供图片下载和压缩工具方法 - 重构 RandomPhotoService 类,使用新的 ImageUtil工具类处理图片 - 添加 thumbnailator 依赖,用于图片压缩处理 --- pom.xml | 6 +++ .../service/randomphoto/RandomPhotoService.kt | 9 ++-- .../alinadace/sakuramiki/util/ImageUtil.kt | 47 +++++++++++++++++++ 3 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 src/main/kotlin/info/alinadace/sakuramiki/util/ImageUtil.kt diff --git a/pom.xml b/pom.xml index db7dccc..5e73379 100644 --- a/pom.xml +++ b/pom.xml @@ -142,6 +142,12 @@ com.squareup.okhttp3 okhttp + + + net.coobird + thumbnailator + 0.4.20 + diff --git a/src/main/kotlin/info/alinadace/sakuramiki/service/randomphoto/RandomPhotoService.kt b/src/main/kotlin/info/alinadace/sakuramiki/service/randomphoto/RandomPhotoService.kt index a1932c3..3d1030e 100644 --- a/src/main/kotlin/info/alinadace/sakuramiki/service/randomphoto/RandomPhotoService.kt +++ b/src/main/kotlin/info/alinadace/sakuramiki/service/randomphoto/RandomPhotoService.kt @@ -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 { 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) } } diff --git a/src/main/kotlin/info/alinadace/sakuramiki/util/ImageUtil.kt b/src/main/kotlin/info/alinadace/sakuramiki/util/ImageUtil.kt new file mode 100644 index 0000000..f7952db --- /dev/null +++ b/src/main/kotlin/info/alinadace/sakuramiki/util/ImageUtil.kt @@ -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(); + } + } +}