如何使用wasm-vips对图像重采样上采样,支持buffer输入与指定插值器?
wasm-vips 上采样实现方案
完整实现代码
const vips = await Vips(); // 替换为你传入的Uint8Array格式图像数据 const inputBuffer = /* 你的图像Uint8Array数据 */; // 从内存buffer加载图像 let im = vips.Image.newFromBuffer(inputBuffer); const targetWidth = 2017; const targetHeight = 2017; // 计算横纵方向缩放比例 const scaleX = targetWidth / im.width; const scaleY = targetHeight / im.height; // 指定插值器,可替换为 nohalo、lanczos2、bilinear 等 const interpolator = vips.Interpolator.new('lanczos3'); // 方式1:使用resize接口(更简洁,推荐) let resizedIm = im.resize(scaleX, { vscale: scaleY, interpolator: interpolator }); // 方式2:使用affine接口(和你查询的官方接口对应) // const transformMatrix = [scaleX, 0, 0, scaleY]; // let resizedIm = im.affine(transformMatrix, { // interpolator: interpolator // }); // 若需要输出为Uint8Array可调用writeToBuffer,后缀名可替换为.png等对应格式 const outputBuffer = resizedIm.writeToBuffer('.jpg'); // 操作完成后释放图像内存,避免泄漏 im.delete(); resizedIm.delete();
关键说明
- 内存数据加载:使用
vips.Image.newFromBuffer()直接接收Uint8Array类型的图像数据作为输入,无需读取本地文件,libvips会自动识别输入的图像格式。 - 插值器指定:通过
vips.Interpolator.new()传入插值器名称即可切换采样算法,支持的取值包括lanczos3、nohalo、lanczos2、bilinear、nearest等。 - 宽高比适配:如果不需要拉伸图像保持原比例,可以先计算等比缩放的最大尺寸,缩放后再通过
embed方法补边到2017x2017即可。
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

