Bun.Image 是一个可链式调用的图像管线,用于解码、调整大小、旋转和重新编码 JPEG、PNG、WebP、HEIC 和 AVIF — 基于 libjpeg-turbo、spng、libwebp 和 SIMD 几何内核,无 npm 依赖,无原生插件构建步骤。
await 一个终端方法。在终端方法被 await 之前不会执行任何工作,并且工作在线程外运行。
输入
构造函数接受路径、字节或Blob — 包括 Bun.file() 和 Bun.s3.file()。Blob#image() 是 new Bun.Image(blob) 的简写:
Content-Type 被忽略。
路径字符串是文件系统路径。 不要直接将用户控制的字符串传递给构造函数 — 那是任意文件读取的原语。将不受信任的输入读取到 Buffer 中(使用 fetch 或 Bun.file 和您自己的验证)然后传递字节。
当传递 TypedArray/ArrayBuffer 时,不要在终端操作挂起时对其进行变异 — 解码在线程外运行并借用字节。SharedArrayBuffer 和可调整大小的缓冲区会被拒绝;使用 buf.slice() 传递固定视图。
第二个 options 参数用于防止解压炸弹并控制 EXIF 处理:
元数据
无需解码像素数据即可读取width、height 和 format:
调整大小
filter 选择重采样内核。默认的 "lanczos3" 是照片的正确选择。
当源文件是 JPEG 且目标大小不超过源文件一半时,解码会直接跳到最近的 M/8 IDCT 缩放,因此从 24 MP 照片生成缩略图永远不会创建全分辨率缓冲区。
旋转 · 翻转
调制
输出格式
调用格式方法设置编码目标;如果没有设置,则复用源格式。palette: true 将图像量化到 ≤256 色调色板,并输出索引(颜色类型 3)PNG,可选 Floyd–Steinberg dither。对于截图和 UI 资源,这通常比真彩色小 3–5 倍。
终端方法
管线在 await 以下方法之一之前不会执行任何工作:.write() 接受与 Bun.write 相同的目的地 — 路径字符串、Bun.file()、Bun.s3.file() 或 fd。如果您没有链式调用格式方法,并且目的地是路径字符串,则扩展名决定格式(.jpg/.png/.webp/.heic/.avif)。
占位符
对于在真实图片加载之前嵌入 HTML 的低质量占位符,.placeholder() 返回一个 ThumbHash 渲染的 ≤32px 模糊 data: URL — 大约 400–700 字节,无需客户端解码器:
img.width 和 img.height 反映输出尺寸(在此之前为 -1)。
Bun.serve 集成
Bun.Image 管线是有效的 Response 主体,并自动设置 Content-Type。要在服务器处理器中将编码保持在线程外,首先 await 一个终端方法:
new Response(img))也可以,但会在主体初始化期间同步运行编码。
剪贴板
fromClipboard() 从 macOS 和 Windows 的系统粘贴板读取 PNG、TIFF、HEIC、JPEG、WebP、GIF 或 BMP;常规解码管线会接管后续处理。如果没有图像则返回 null,在 Linux 上始终返回 null — 自行调用 wl-paste/xclip 并将字节传递给构造函数。
对于”图像在剪贴板,按 ⌘V”的被动提示,轮询 clipboardChangeCount()(单次整数读取)并在其变化时调用 hasClipboardImage();macOS 没有剪贴板变化通知,因此这是文档化的模式。
平台后端
¹ Windows 需要来自 Microsoft Store 的 HEIF Image Extensions / AV1 Video Extension。
² AVIF 编码 需要操作系统的 AV1 编码器 — 仅 Apple Silicon M3+。Intel Mac 和 M1/M2 会拒绝并返回
ERR_IMAGE_FORMAT_UNSUPPORTED;AVIF 解码 在 ImageIO 支持的任何地方都可以工作(macOS 13+)。
当系统后端的格式在当前机器上不可用时,终端方法会 reject 并返回 error.code === "ERR_IMAGE_FORMAT_UNSUPPORTED" — 在此条件分支上回退到可移植格式: