元数据工具
从 NovelAI 生成的图像中提取和操作元数据。
提取元数据
读取嵌入在 NovelAI 图像中的生成参数:
typescript
import { extractMetadata } from 'novelai-sdk-unofficial';
import { readFileSync } from 'fs';
const imageBuffer = readFileSync('novelai-image.png');
const metadata = await extractMetadata(imageBuffer);
console.log(metadata);
// {
// prompt: '1girl, cat ears',
// negativePrompt: 'bad anatomy',
// steps: 28,
// scale: 5.0,
// seed: 12345,
// sampler: 'k_euler_ancestral',
// ...
// }元数据字段
ImageMeta 类型包含:
| 字段 | 类型 | 描述 |
|---|---|---|
prompt | string | 生成提示词 |
negativePrompt | string | 负面提示词 |
steps | number | 生成步数 |
scale | number | CFG 比例 |
seed | number | 随机种子 |
sampler | string | 使用的采样器 |
width | number | 图像宽度 |
height | number | 图像高度 |
model | string | 使用的模型 |
擦除元数据
为保护隐私从图像中移除元数据:
typescript
import { eraseMetadata } from 'novelai-sdk-unofficial';
import { readFileSync, writeFileSync } from 'fs';
const imageBuffer = readFileSync('novelai-image.png');
// 擦除所有元数据
const cleanImage = await eraseMetadata(imageBuffer, 'all');
writeFileSync('clean-image.png', cleanImage);擦除目标
| 目标 | 描述 |
|---|---|
'all' | 移除所有元数据 |
'prompt' | 仅移除提示词相关数据 |
'stealth' | 移除隐写元数据 |
typescript
// 仅移除提示词
const noPrompt = await eraseMetadata(imageBuffer, 'prompt');
// 移除隐写元数据
const noStealth = await eraseMetadata(imageBuffer, 'stealth');
// 移除所有
const clean = await eraseMetadata(imageBuffer, 'all');使用场景
复现图像
typescript
const metadata = await extractMetadata(imageBuffer);
// 使用提取的参数重新生成
const images = await client.image.generate({
prompt: metadata.prompt,
negativePrompt: metadata.negativePrompt,
steps: metadata.steps,
scale: metadata.scale,
seed: metadata.seed,
sampler: metadata.sampler as Sampler,
});分享前保护隐私
typescript
async function prepareForSharing(imagePath: string): Promise<Buffer> {
const image = readFileSync(imagePath);
return eraseMetadata(image, 'all');
}
const safeImage = await prepareForSharing('my-image.png');
writeFileSync('share-safe.png', safeImage);批量元数据提取
typescript
import { readdir } from 'fs/promises';
import { join } from 'path';
async function extractAllMetadata(directory: string) {
const files = await readdir(directory);
const pngFiles = files.filter(f => f.endsWith('.png'));
const results = [];
for (const file of pngFiles) {
const buffer = readFileSync(join(directory, file));
try {
const meta = await extractMetadata(buffer);
results.push({ file, metadata: meta });
} catch {
results.push({ file, metadata: null });
}
}
return results;
}错误处理
typescript
try {
const metadata = await extractMetadata(imageBuffer);
console.log(metadata);
} catch (error) {
console.error('提取元数据失败:', error.message);
// 图像可能不是来自 NovelAI 或元数据可能已损坏
}注意事项
- 只有来自 NovelAI 的 PNG 图像包含可提取的元数据
- JPEG 和其他格式不保留 NovelAI 元数据
- 某些图像可能已经被移除了元数据
- SDK 可以读取标准和隐写两种元数据格式