@simon_he/browser-compress-image
Version:
🚀 A powerful, lightweight browser image compression library with TypeScript support. Compress JPEG, PNG, GIF images with multiple output formats (Blob, File, Base64, ArrayBuffer) and zero dependencies.
94 lines • 2.88 kB
TypeScript
//#region src/types.d.ts
type CompressResultType = 'blob' | 'file' | 'base64' | 'arrayBuffer';
type CompressResult<T extends CompressResultType> = T extends 'blob' ? Blob : T extends 'file' ? File : T extends 'base64' ? string : T extends 'arrayBuffer' ? ArrayBuffer : never;
interface CompressOptions {
/**
* 压缩质量 (0-1)
* @default 0.6
*/
quality?: number;
/**
* 压缩模式
* - 'keepSize': 保持图片尺寸不变 (如100x100输入,输出仍为100x100),只改变文件大小
* - 'keepQuality': 保持图片质量不变,但可以改变尺寸
* @default 'keepSize'
*/
mode?: 'keepSize' | 'keepQuality';
/**
* 目标宽度 (仅在 keepQuality 模式下生效)
*/
targetWidth?: number;
/**
* 目标高度 (仅在 keepQuality 模式下生效)
*/
targetHeight?: number;
/**
* 最大宽度 (仅在 keepQuality 模式下生效)
*/
maxWidth?: number;
/**
* 最大高度 (仅在 keepQuality 模式下生效)
*/
maxHeight?: number;
/**
* 是否保留 EXIF 信息
* @default false
*/
preserveExif?: boolean;
/**
* 是否返回所有工具的压缩结果
* @default false
*/
returnAllResults?: boolean;
/**
* 返回结果类型
* @default 'blob'
*/
type?: CompressResultType;
}
interface CompressResultItem<T extends CompressResultType> {
tool: string;
result: CompressResult<T>;
originalSize: number;
compressedSize: number;
compressionRatio: number;
duration: number;
success: boolean;
error?: string;
}
interface MultipleCompressResults<T extends CompressResultType> {
bestResult: CompressResult<T>;
bestTool: string;
allResults: CompressResultItem<T>[];
totalDuration: number;
}
//#endregion
//#region src/compress.d.ts
declare function compress<T extends CompressResultType = 'blob'>(file: File, options: CompressOptions & {
type?: T;
returnAllResults: true;
}): Promise<MultipleCompressResults<T>>;
declare function compress<T extends CompressResultType = 'blob'>(file: File, options: CompressOptions & {
type?: T;
returnAllResults?: false;
}): Promise<CompressResult<T>>;
declare function compress<T extends CompressResultType = 'blob'>(file: File, quality?: number, type?: T): Promise<CompressResult<T>>;
interface CompressionStats {
bestTool: string;
compressedFile: Blob;
originalSize: number;
compressedSize: number;
compressionRatio: number;
totalDuration: number;
toolsUsed: {
tool: string;
size: number;
duration: number;
compressionRatio: number;
success: boolean;
error?: string;
}[];
}
declare function compressWithStats(file: File, qualityOrOptions?: number | CompressOptions): Promise<CompressionStats>;
//#endregion
export { CompressOptions, CompressResult, CompressResultItem, CompressResultType, CompressionStats, MultipleCompressResults, compress, compressWithStats };