koishi-plugin-hhs-huatu
Version:
Generate images by diffusion models
191 lines (190 loc) • 7.39 kB
TypeScript
import { Context, Dict } from 'koishi';
import { ImageData } from './types';
declare module 'koishi' {
interface Context {
runtime?: {
currentTokenIndex: number;
tokenUsage?: Record<number, boolean>;
tokenPool?: string[];
poolIndex?: number;
lastPoolRefreshTime?: number;
_forcedTokenIndex?: number;
_redraw?: boolean;
_timeStamp?: number;
_taskIndex?: number;
_taskId?: number;
};
}
}
export declare function project(object: {}, mapping: {}): {};
export interface Size {
width: number;
height: number;
}
export declare function getImageSize(buffer: ArrayBuffer): Size;
/**
* 图片内存缓存,以 URL 为 key 缓存已下载的 ImageData。
* - 默认 TTL 为 5 分钟(300000ms),每次读取时自动刷新
* - 最大内存上限默认 200MB,超过时自动淘汰最久未使用的条目(LRU)
* - TTL 到期后自动从内存中移除
* - 利用 Map 的插入顺序特性实现 LRU:访问时删除并重新插入到末尾
*/
declare class ImageCache {
private cache;
private ttl;
private maxBytes;
private currentBytes;
/**
* @param ttlMs 缓存过期时间(毫秒),默认 5 分钟
* @param maxMB 最大缓存内存(MB),默认 200MB
*/
constructor(ttlMs?: number, maxMB?: number);
/** 从缓存中获取图片,命中时刷新 TTL 并更新 LRU 顺序 */
get(url: string): ImageData | undefined;
/** 将图片存入缓存,超过内存上限时淘汰最久未使用的条目 */
set(url: string, data: ImageData): void;
/** 内部方法:移除指定条目并释放内存计数 */
private _evict;
/** 清除所有缓存条目 */
clear(): void;
/** 当前缓存条目数 */
get size(): number;
/** 当前缓存占用内存(字节) */
get memoryUsage(): number;
/** 当前缓存占用内存(MB,保留两位小数) */
get memoryUsageMB(): number;
}
/** 全局图片缓存实例(TTL 5分钟,上限 200MB) */
export declare const imageCache: ImageCache;
export declare function download(ctx: Context, url: string, headers?: {}): Promise<ImageData>;
export declare function calcAccessKey(email: string, password: string): Promise<string>;
export declare function calcEncryptionKey(email: string, password: string): Promise<string>;
export declare class NetworkError extends Error {
params: {};
constructor(message: string, params?: {});
static catch: (mapping: Dict<string>) => (e: any) => never;
}
export declare function initTokenPool(ctx: Context): Promise<string[]>;
export declare function login(ctx: Context, email: string, password: string): Promise<string>;
export declare function closestMultiple(num: number, mult?: number): number;
export interface Size {
width: number;
height: number;
/** Indicate whether this resolution is pre-defined or customized */
custom?: boolean;
}
export declare function resizeInput(size: Size): Size;
export declare function forceDataPrefix(url: string, mime?: string): string;
/**
* 将位置字符串(如 "A1" 到 "E5")转换为坐标
* 横向: A(-0.4) → B(-0.2) → C(0) → D(+0.2) → E(+0.4)
* 纵向: 1(-0.4) → 2(-0.2) → 3(0) → 4(+0.2) → 5(+0.4)
* @param position 位置字符串,默认为 "C3" (中心点)
* @returns 坐标对象 { x, y },值域为 [0.1, 0.9]
*/
export declare function convertPosition(position?: string): {
x: number;
y: number;
};
/**
* 检查模型是否支持 Characters 功能
* @param model 模型名称
* @returns 是否支持 Characters
*/
export declare function modelSupportsCharacters(model: string): boolean;
/**
* 解析用户友好的 characters 文本格式
* 格式:prompt@position --uc:negative;prompt2@position2
*
* 示例:
* - "1girl, red hair@B3;1boy, blue eyes@D3"
* - "1girl@B3 --uc:frown;1boy@D3"
* - "princess, dress@C2 --uc:messy;knight@C4"
* - 支持中文分号:"1girl@B3;1boy@D3"
*
* @param input 用户输入的字符串
* @returns Character 数组
*/
export declare function parseCharacters(input: string): Array<{
prompt: string;
uc?: string;
position?: string;
}>;
export declare function createContextWithRuntime(ctx: Context, runtime: any): Context;
/**
* 将尺寸对齐到64的倍数(NovelAI API要求)
*/
export declare function alignTo64(size: number): number;
/**
* NovelAI 最大总像素数限制(不包括该值本身)
* 经测试:28*64 x 28*64 = 1792x1792 = 3,211,264 不能生成
* 27*64 x 28*64 = 1728x1792 = 3,096,576 可以生成
*/
export declare const NAI_MAX_PIXELS = 3211264;
/**
* 将宽高限制在 NovelAI 最大像素限制范围内
* 如果总像素数 >= NAI_MAX_PIXELS,等比缩小并对齐到64的倍数
* @param width 原始宽度(已对齐64)
* @param height 原始高度(已对齐64)
* @returns 缩小后的尺寸和是否发生了缩小
*/
export declare function clampToNAILimit(width: number, height: number): {
width: number;
height: number;
clamped: boolean;
};
/**
* 将图片调暗并对齐尺寸(用于局部重绘的交互式流程)
* @param imageData 原始图片数据
* @param factor 调暗系数(0-1,默认0.5)
* @param targetWidth 可选的目标宽度(用户通过 -r 指定时传入)
* @param targetHeight 可选的目标高度(用户通过 -r 指定时传入)
* @returns 调暗后的图片Data URL和对齐后的尺寸
*/
export declare function darkenImage(imageData: ImageData, factor?: number, targetWidth?: number, targetHeight?: number): Promise<{
dataUrl: string;
alignedWidth: number;
alignedHeight: number;
originalBuffer: Buffer;
}>;
/**
* 针对 NovelAI V4 优化的 Mask 处理算法
* 逻辑复刻自 Auto-NovelAI-Refactor 的 process_white_regions
* 1. 二值化
* 2. 8x8 网格对齐 (Latent Alignment)
* 3. 区域膨胀 (Block Dilation) 确保覆盖边缘
*
* @param imageData 用户涂白的图片数据
* @param targetWidth 目标宽度(对齐到64的倍数)
* @param targetHeight 目标高度(对齐到64的倍数)
* @returns 处理后的遮罩base64(不含data:前缀)
*/
export declare function extractMaskWithAntiArtifact(imageData: ImageData, targetWidth: number, targetHeight: number): Promise<string>;
/**
* 从用户涂白的图片中提取遮罩并进行膨胀处理(旧版,保留兼容)
* @deprecated 推荐使用 extractMaskWithAntiArtifact
*/
export declare function extractAndDilateMask(imageData: ImageData, threshold?: number, minPenSize?: number): Promise<string>;
/**
* 检查模型是否支持 Character Reference Image 功能
* 仅 v4.5 模型支持此功能
* @param model 模型名称
* @returns 是否支持角色参考
*/
export declare function modelSupportsCharacterReference(model: string): boolean;
/**
* 将角色参考图片调整到 NovelAI 要求的尺寸
* 参考 Auto-NovelAI-Refactor 的 process_image_by_orientation 函数
* - 横图:1536×1024
* - 竖图:1024×1536
* - 方图:1472×1472
*
* @param imageData 原始图片数据
* @returns 处理后的图片 base64(不含 data: 前缀)和尺寸信息
*/
export declare function processCharacterReferenceImage(imageData: ImageData): Promise<{
base64: string;
width: number;
height: number;
}>;
export {};