You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C#从Beat Saber精灵表提取指定封面图片?

Beat Saber关卡封面提取方案(C#实现)

核心逻辑

Beat Saber的关卡封面精灵表采用固定网格排布(单张尺寸168x168像素),你手中的GUID是映射封面位置的关键依据——游戏通常会通过GUID的哈希值计算精灵在表中的索引。没有直接坐标的情况下,我们可以通过GUID推导位置,再裁剪出目标图片。

具体步骤

1. 加载精灵表并计算网格布局

推荐使用ImageSharp(跨平台兼容性更好)加载精灵表,计算网格的行列数与总精灵数:

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var spritesheet = Image.Load<Rgba32>("你的精灵表路径.png");
const int SpriteSize = 168;

int cols = spritesheet.Width / SpriteSize;
int rows = spritesheet.Height / SpriteSize;
int totalSprites = cols * rows;

2. 通过GUID计算精灵索引

Beat Saber常用SHA1哈希处理GUID来生成资源索引,实现代码如下:

using System;
using System.Security.Cryptography;
using System.Text;

string levelGuid = "你的关卡GUID";
byte[] hash;
using (var sha1 = SHA1.Create())
{
    hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(levelGuid));
}
// 取哈希前4字节转换为整数,取模得到索引(用Abs避免负数)
int spriteIndex = Math.Abs(BitConverter.ToInt32(hash, 0)) % totalSprites;

3. 计算目标图片的坐标

根据索引推导对应的行列位置与像素坐标:

int row = spriteIndex / cols;
int col = spriteIndex % cols;

int x = col * SpriteSize;
int y = row * SpriteSize;

4. 裁剪并保存封面

从精灵表中裁剪出目标区域并保存:

using var cover = spritesheet.Clone(c => c.Crop(new Rectangle(x, y, SpriteSize, SpriteSize)));
cover.Save("保存的封面路径.png");

5. 验证提取结果(可选)

如果得到的图片不符合预期,可以用歌曲名辅助验证:

  • 对比裁剪图的哈希值与已知的该歌曲封面哈希
  • 使用Tesseract.NET做简单OCR,识别图中标题是否匹配歌曲名

备选方案(若GUID索引失效)

若上述方法未得到正确图片,可尝试以下思路:

  • 用歌曲名的SHA1哈希代替GUID计算索引
  • 遍历所有精灵,提取后对比已知封面的哈希值(若有对应哈希库)
  • 检查精灵表的EXIF元数据(Beat Saber一般不会存储,但可尝试排查)

内容的提问来源于stack exchange,提问作者AshTheAlpaca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 20:34:55