我正在为 TavernAI 字符卡制作一个编辑器,将字符数据编码到文本 EXIF 字段中。
一开始似乎工作正常,直到我将角色卡加载到流行的 TavernAI 分支 Silly Tavern 中,此时它说没有角色元数据。事实证明,ImageSharp 将长文本元数据放入 zTXt 格式,这是规范不支持的。
这就是我保存角色卡的方法:
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Png.Chunks;
using SixLabors.ImageSharp.PixelFormats;
using var image = new Image<Rgba32>(1, 1);
var imageMetadata = image.Metadata.GetPngMetadata();
var metadataList = (List<PngTextData>)imageMetadata.TextData;
metadataList.RemoveAll(m => m.Keyword == "chara");
var aLotOfText = new string('a', 50000); // It seems to compress only if the text is big
var metadataEntry = new PngTextData("chara", aLotOfText, string.Empty, string.Empty);
metadataList.Add(metadataEntry);
image.SaveAsPng("test.png");
您可以通过运行
exiftool -v test.png
检查它是否输出 zTXt 元数据。有没有办法告诉 SixLabors.ImageSharp 将长元数据块写入 tEXt 而不是 zTXt?
事实证明,ImageSharp 将长文本元数据放入 zTXt 格式,这是规范不支持的。
您是指 Silly Tavern 规范吗?因为 zTxt 块绝对受 png 规范支持。
https://www.w3.org/TR/PNG-Chunks.html
要强制 ImageSharp 使用文本,您可以新建一个
PngEncoder
实例并将 Threshold 属性更改为更大的值。然后将编码器传递给您的 SaveAsPng 方法。