如何告诉 SixLabors.ImageSharp 将元数据写入 tEXt 而不是 zTXt?

问题描述 投票:0回答:1

我正在为 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?

c# png exif imagesharp sixlabors.imagesharp
1个回答
0
投票

事实证明,ImageSharp 将长文本元数据放入 zTXt 格式,这是规范不支持的。

您是指 Silly Tavern 规范吗?因为 zTxt 块绝对受 png 规范支持。

https://www.w3.org/TR/PNG-Chunks.html

要强制 ImageSharp 使用文本,您可以新建一个

PngEncoder
实例并将 Threshold 属性更改为更大的值。然后将编码器传递给您的 SaveAsPng 方法。

© www.soinside.com 2019 - 2024. All rights reserved.