feat: support greyscale a gif

This commit is contained in:
2024-10-29 11:47:25 +08:00
parent 40d4661e1b
commit 9af2916dfc
2 files changed
+15 -7

No files matched your search

+13 -5
View File
@@ -26,6 +26,7 @@ import cn.rtast.fancybot.util.misc.initCommand
import cn.rtast.fancybot.util.misc.initFilesDir import cn.rtast.fancybot.util.misc.initFilesDir
import cn.rtast.fancybot.util.misc.initItems import cn.rtast.fancybot.util.misc.initItems
import cn.rtast.fancybot.util.misc.initSetuIndex import cn.rtast.fancybot.util.misc.initSetuIndex
import cn.rtast.fancybot.util.misc.makeGif
import cn.rtast.fancybot.util.misc.toBufferedImage import cn.rtast.fancybot.util.misc.toBufferedImage
import cn.rtast.fancybot.util.misc.toByteArray import cn.rtast.fancybot.util.misc.toByteArray
import cn.rtast.fancybot.util.misc.toGrayscale import cn.rtast.fancybot.util.misc.toGrayscale
@@ -44,10 +45,12 @@ import cn.rtast.rob.enums.QQFace
import cn.rtast.rob.util.ob.MessageChain import cn.rtast.rob.util.ob.MessageChain
import cn.rtast.rob.util.ob.OneBotAction import cn.rtast.rob.util.ob.OneBotAction
import cn.rtast.rob.util.ob.OneBotListener import cn.rtast.rob.util.ob.OneBotListener
import com.madgag.gif.fmsware.GifDecoder
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.File import java.io.File
import java.net.URI import java.net.URI
@@ -133,13 +136,11 @@ class FancyBot : OneBotListener {
plainTextContent.trim().makeShortLink() plainTextContent.trim().makeShortLink()
) )
if (command.contains("/ascii") || command.contains("/asc")) { if (command.contains("/ascii") || command.contains("/asc")) {
// 使用回复消息的方式直接对一个图片进行生成Ascii art的操作
val url = AsciiArtCommand.getImageUrl(getMsg) val url = AsciiArtCommand.getImageUrl(getMsg)
val image = AsciiArtCommand.generateAsciiArt(url) val image = AsciiArtCommand.generateAsciiArt(url)
message.reply(image) message.reply(image)
} }
if (command.contains("/pb") || command.contains("/pastebin")) { if (command.contains("/pb") || command.contains("/pastebin")) {
// 使用回复消息的方式快速将创建一个pastebin
val pastebinUrl = PastebinCommand.createPastebin(plainTextContent) val pastebinUrl = PastebinCommand.createPastebin(plainTextContent)
message.reply(pastebinUrl) message.reply(pastebinUrl)
} }
@@ -151,11 +152,18 @@ class FancyBot : OneBotListener {
val msg = MessageChain.Builder() val msg = MessageChain.Builder()
getMsg.message.filter { it.type == ArrayMessageType.image || it.type == ArrayMessageType.mface } getMsg.message.filter { it.type == ArrayMessageType.image || it.type == ArrayMessageType.mface }
.forEach { .forEach {
val base64 = it.data.file!!.toURL() val imgUrl = it.data.file!!
.readBytes().toBufferedImage() val decoder = GifDecoder()
.toGrayscale().toByteArray().encodeToBase64() val imageStream = withContext(Dispatchers.IO) { imgUrl.toURL().openStream() }
decoder.read(imageStream)
if (decoder.frameCount == 0) {
msg.addImage(imageStream.readBytes().toBufferedImage().toByteArray().encodeToBase64(), true)
} else {
val frames = (0 until decoder.frameCount).map { decoder.getFrame(it).toGrayscale() }
val base64 = decoder.makeGif(frames).encodeToBase64()
msg.addImage(base64, true) msg.addImage(base64, true)
} }
}
message.reply(msg.build()) message.reply(msg.build())
} }
} }
@@ -100,7 +100,7 @@ class AsciiArtCommand : BaseCommand() {
try { try {
decoder.read(gifStream) decoder.read(gifStream)
if (decoder.frameCount == 0) { if (decoder.frameCount == 0) {
val bufferedImage = withContext(Dispatchers.IO) { ImageIO.read(URI(url).toURL()) } val bufferedImage = withContext(Dispatchers.IO) { ImageIO.read(gifStream) }
val imageBytes = bufferedImage.convertToAscii() val imageBytes = bufferedImage.convertToAscii()
.saveAsciiArtToImage(bufferedImage.width, bufferedImage.height) .saveAsciiArtToImage(bufferedImage.width, bufferedImage.height)
.toByteArray() .toByteArray()