Metadata Utilities
Extract and manipulate metadata from NovelAI-generated images.
Extract Metadata
Read generation parameters embedded in NovelAI images:
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',
// ...
// }Metadata Fields
The ImageMeta type includes:
| Field | Type | Description |
|---|---|---|
prompt | string | Generation prompt |
negativePrompt | string | Negative prompt |
steps | number | Generation steps |
scale | number | CFG scale |
seed | number | Random seed |
sampler | string | Sampler used |
width | number | Image width |
height | number | Image height |
model | string | Model used |
Erase Metadata
Remove metadata from images for privacy:
typescript
import { eraseMetadata } from 'novelai-sdk-unofficial';
import { readFileSync, writeFileSync } from 'fs';
const imageBuffer = readFileSync('novelai-image.png');
// Erase all metadata
const cleanImage = await eraseMetadata(imageBuffer, 'all');
writeFileSync('clean-image.png', cleanImage);Erase Targets
| Target | Description |
|---|---|
'all' | Remove all metadata |
'prompt' | Remove only prompt-related data |
'stealth' | Remove stealth metadata |
typescript
// Remove only prompt
const noPrompt = await eraseMetadata(imageBuffer, 'prompt');
// Remove stealth metadata
const noStealth = await eraseMetadata(imageBuffer, 'stealth');
// Remove everything
const clean = await eraseMetadata(imageBuffer, 'all');Use Cases
Reproduce an Image
typescript
const metadata = await extractMetadata(imageBuffer);
// Use extracted parameters to regenerate
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,
});Privacy Before Sharing
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);Batch Metadata Extraction
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;
}Error Handling
typescript
try {
const metadata = await extractMetadata(imageBuffer);
console.log(metadata);
} catch (error) {
console.error('Failed to extract metadata:', error.message);
// Image may not be from NovelAI or metadata may be corrupted
}Notes
- Only PNG images from NovelAI contain extractable metadata
- JPEG and other formats don't preserve NovelAI metadata
- Some images may have metadata stripped already
- The SDK reads both standard and stealth metadata formats