feat(randomphoto): 优化图片下载和压缩功能
- 新增 ImageUtil 类,提供图片下载和压缩工具方法 - 重构 RandomPhotoService 类,使用新的 ImageUtil工具类处理图片 - 添加 thumbnailator 依赖,用于图片压缩处理
This commit is contained in:
parent
fbfb1c1a7f
commit
4f8e447bdd
6
pom.xml
6
pom.xml
@ -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>
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
47
src/main/kotlin/info/alinadace/sakuramiki/util/ImageUtil.kt
Normal file
47
src/main/kotlin/info/alinadace/sakuramiki/util/ImageUtil.kt
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user