export type RGB = [number, number, number]; export type RGBA = [number, number, number, number]; export type ToneMappingMode = "off" | "contrast" | "scurve"; export type ColorMatchingMode = "rgb" | "lab" | "chroma"; export type DynamicRangeCompressionMode = "off" | "display" | "auto"; export type LevelCompressionMode = "off" | "perChannel" | "luma"; export type PaperNormalizationMode = "off" | "warmPaper"; export type AdjustmentQuality = "fast" | "accurate"; export type LevelRGB = number | RGB; export interface PercentileClip { low: number; high: number; } export interface LevelCompressionOptions { mode?: LevelCompressionMode; black?: LevelRGB; white?: LevelRGB; auto?: boolean; autoThreshold?: number; percentileClip?: PercentileClip; } export interface ClarityOptions { amount?: number; radius?: number; midtone?: number; } export interface ToneMappingOptions { mode?: ToneMappingMode; /** * Exposure adjustment in stops. `0` is neutral, `1` doubles brightness. */ exposure?: number; /** * Saturation adjustment. `0` is neutral, `0.5` means 1.5x, `-1` removes saturation. */ saturation?: number; /** * Contrast adjustment. `0` is neutral, `0.25` means 1.25x, `-1` means 0.5x. */ contrast?: number; strength?: number; shadowBoost?: number; highlightCompress?: number; midpoint?: number; } export interface DynamicRangeCompressionOptions { mode?: DynamicRangeCompressionMode; black?: LevelRGB; white?: LevelRGB; strength?: number; lowPercentile?: number; highPercentile?: number; quality?: AdjustmentQuality; preserveWhite?: boolean; whitePreservePercentile?: number; whitePreserveMinLuma?: number; whitePreserveMaxSaturation?: number; } export interface PaperNormalizationOptions { mode?: PaperNormalizationMode; strength?: number; minLuma?: number; saturationThreshold?: number; warmBiasThreshold?: number; blackAnchor?: number; preserveRed?: number; paperWhite?: LevelRGB; } export interface ImageProcessingOptions { paperNormalization?: PaperNormalizationOptions; clarity?: ClarityOptions; toneMapping?: ToneMappingOptions; dynamicRangeCompression?: DynamicRangeCompressionOptions | boolean; levelCompression?: LevelCompressionOptions; previewMode?: "fast" | "final"; } export type ProcessingPresetName = "balanced" | "dynamic" | "vivid" | "soft" | "grayscale" | "restore" | "posterScan" | (string & {}); export interface ProcessingPreset { name: ProcessingPresetName; title: string; description: string; paperNormalization?: PaperNormalizationOptions; toneMapping: ToneMappingOptions; dynamicRangeCompression?: DynamicRangeCompressionOptions; colorMatching?: ColorMatchingMode; errorDiffusionMatrix?: string; } export interface ImageDataLike { width: number; height: number; data: Uint8ClampedArray; } export declare const PROCESSING_PRESETS: Record; export declare const getProcessingPreset: (name: ProcessingPresetName) => ProcessingPreset | null; export declare const getProcessingPresetNames: () => ProcessingPresetName[]; export declare const getProcessingPresetOptions: () => { value: ProcessingPresetName; title: string; description: string; }[]; export declare const clampByte: (value: number) => number; export declare const luma709: (r: number, g: number, b: number) => number; export declare const toRGB: (value: LevelRGB | undefined, fallback: number) => RGB; export declare const toScalar: (value: LevelRGB | undefined, fallback: number) => number; export declare const rgbToLab: (r: number, g: number, b: number) => RGB; export declare const labToRgb: (l: number, a: number, b: number) => RGB; export declare const deltaE: (lab1: RGB, lab2: RGB) => number; export declare const applyToneMapping: (image: ImageDataLike, options: ToneMappingOptions | undefined, levelCompression?: LevelCompressionOptions) => void; export declare const applyImageProcessing: (image: ImageDataLike, options: ImageProcessingOptions | undefined, palette?: RGB[]) => void;