Skip to main content
Bun.Image 是一个可链式调用的图像管道,用于解码、调整大小、旋转以及重新编码 JPEG、PNG、WebP、HEIC 和 AVIF。它基于 libjpeg-turbo、spng、libwebp 和 SIMD 几何内核构建,无需 npm 依赖,也无需构建原生插件。
此 API 参考了 Sharp 的设计:从输入构造实例,链式调用转换,选择输出格式,然后 await 一个终结方法。只有在你等待终结方法时才会执行操作,且处理会在 JavaScript 线程之外执行。

输入

构造函数接受路径、字节或 Blob——包括 Bun.file() 和 Bun.s3.file()。Blob#image() 是 new Bun.Image(blob) 的简写:
Bun 会从字节中检测格式,并忽略扩展名和 Content-Type。 **路径字符串是文件系统路径。**不要将用户控制的字符串直接传给构造函数——这会产生任意文件读取原语。请先使用 fetch 或 Bun.file 将不受信任的输入读入 Buffer,并进行你自己的验证,然后再传入这些字节。 传入 TypedArray/ArrayBuffer 时,终结方法正在执行期间不要修改它——解码会在线程外运行,并借用这些字节。Bun 不接受 SharedArrayBuffer 和可调整大小的缓冲区;请使用 buf.slice() 传入固定视图。 当 libjpeg-turbo 仅发出警告就能完成解码时,Bun 会解码损坏的 JPEG。例如,段之间有多余字节、缺少图像结束标记,以及扫描数据被截断。libjpeg-turbo 会将没有数据的块填充为纯灰色。渐进式文件若在第一次扫描后被截断,则每个块都有数据,因此 Bun 会返回细节较少的完整图像。当 libjpeg-turbo 无法完成解码时,终结方法会以 ERR_IMAGE_DECODE_FAILED 拒绝。metadata() 只读取头部,因此即使终结方法会拒绝,它也可能成功解析。 第二个 options 参数用于防护解压炸弹并控制 EXIF 处理:

元数据

无需解码像素数据即可读取 width、height 和 format:

调整大小

filter 用于选择重采样内核。默认的 "lanczos3" 是照片的最佳选择。 当源图像是 JPEG 且目标尺寸不超过源图像的一半时,解码会直接跳到最接近的 M/8 IDCT 缩放级别。因此,从一张 24 MP 照片生成缩略图时,不会创建全分辨率缓冲区。

旋转 · 翻转

调节

输出格式

调用格式方法会设置编码目标;如果没有调用格式方法,Bun 会沿用源格式。
palette: true 会将图像量化为不超过 256 种颜色的调色板,并输出索引(color-type 3)PNG,可选择使用 Floyd–Steinberg dither。对于屏幕截图和 UI 资源,索引 PNG 通常比真彩色图像小 3–5 倍。

终结方法

管道在等待以下任一方法之前不会执行任何操作:
.write() 接受与 Bun.write 相同的目标类型——路径字符串、Bun.file()、Bun.s3.file() 或文件描述符。如果你没有链式调用格式方法,并且目标是路径字符串,则扩展名会决定格式(.jpg/.png/.webp/.heic/.avif)。

占位符

.placeholder() 会返回一个低质量占位图,可在真实图像加载前内嵌到 HTML 中。占位图是以 data: URL 呈现的 ThumbHash 渲染的 ≤32px 模糊图像。大小约为 400–700 字节,无需客户端解码器:
如果想对图像 本身 进行由粗到细的渲染,请编码为渐进式 JPEG:
第一个终结方法解析后,img.width 和 img.height 反映的是 输出 尺寸(在此之前它们为 -1)。

Bun.serve 集成

Bun.Image 管道是一个有效的 Response body,并会自动设置 Content-Type。为了在服务端处理程序中让编码保持在 JS 线程之外,请先 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+)。 ³ 仅在使用默认 lanczos3 滤镜时,调整大小才会使用 vImage;在 macOS 上,其他所有 filter 都会使用 Highway SIMD。 当当前计算机上无法使用系统后端格式时,终结方法会以 error.code === "ERR_IMAGE_FORMAT_UNSUPPORTED" 拒绝。请根据该错误代码分支处理,以回退到可移植格式:
由系统后端处理的格式(TIFF、HEIC、AVIF、剪贴板)会采用操作系统的补丁级别,因此请保持 macOS / Windows 为最新版本。JPEG、PNG 和 WebP 在所有平台上都使用相同的静态链接编解码器,因此在 Linux、macOS 和 Windows 上编码的输出逐字节相同。若要让几何处理也强制使用可移植的 Highway 路径(例如用于黄金图像测试),请设置进程全局后端: