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>
|
<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>
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
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