末屿宇宙 – 通过 Spigot 插件在 Minecraft 聊天框显示低清图片

以方块字符作为像素点显示图片

优点:可以不离开 Minecraft 界面,通过缩略图,大概判断群聊中图片的内容,从而提升游戏内外沟通效率。
缺点:分辨率真的很低(

https://github.com/Ylkawa/MoyuUniverse/blob/1e673e440c11d1e3a39ad6bb5402a0cb86a98a84/Minecraft-Connect/src/main/java/com/nekoyu/Universe/MinecraftConnect/MinecraftConnectSpigot.java#L150

ComponentBuilder bc = new ComponentBuilder();

BufferedImage bi = ImageIO.read(imgF.url);
int maxSize = 40;
double scale = Math.min(
        (double) maxSize / bi.getWidth(),
        (double) maxSize / bi.getHeight()
);
int targetWidth  = (int) (bi.getWidth()  * scale);
int targetHeight = (int) (bi.getHeight() * scale);
Image scaled = bi.getScaledInstance(targetWidth, targetHeight, Image.SCALE_SMOOTH);
BufferedImage resized = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = resized.createGraphics();
g.drawImage(scaled, 0, 0, null);
g.dispose();
StringBuilder sb = new StringBuilder();
for (int y = 0; y < resized.getHeight(); y++) {
    for (int x = 0; x < resized.getWidth(); x++) {
        int rgb = resized.getRGB(x, y);
        int r = (rgb >> 16) & 0xFF;
        int gr = (rgb >> 8) & 0xFF;
        int b = rgb & 0xFF;
        sb.append(colorHex(r, gr, b)).append("█");
    }
    sb.append("\n");
}
BaseComponent[] hover = TextComponent.fromLegacyText(sb.toString());
TextComponent tc = new TextComponent(ChatColor.UNDERLINE + "[图片]");
tc.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(hover)));
bc.append(tc);

流程简而言之:
降分辨率 -> 逐像素转换为带颜色标记的方块字符 -> 作为 HoverEvent.Action.SHOW_TEXT 添加到消息

具体实现使用方法:将鼠标指针悬浮到聊天框中的 [图片] 上,就能显示内容了