sharp或@napi-rs/canva
写代码很简单,但是我部署到线上就构建失败 没有水印内容 没有中文字符 sharp包找不到 中文显示乱码等等问题 最后成功运行的dockerfile放在最下面和对应的字体
最后用了@napi-rs/canva 因为觉得sharp还要安装非常多东西
比较如下(gpt生成)
1. 基本介绍
| @napi-rs/canvas | sharp | |
|---|---|---|
| 技术栈 | Rust 写的 Node.js Canvas API 实现,前端风格 | 基于 C/C++ libvips 库的高性能 Node.js 图像处理库 |
| 用法风格 | 像前端 Canvas2D 那样绘图 | 声明式、链式调用,面向图片整体处理 |
| 安装依赖 | 纯 Node-Rust,依赖极少,无需本地编译环境 | 依赖 libvips,自动安装,但体积略大 |
2. 功能对比
| 功能 | @napi-rs/canvas | sharp |
|---|---|---|
| 图片水印(图片叠加) | 支持(drawImage) | 支持(composite) |
| 文字水印(自定义样式) | 非常灵活(font/变换/阴影) | 需要SVG辅助,样式有限 |
| 复杂水印(旋转、弯曲、阴影) | 很强,随意操作 | 依赖SVG或生成图片 |
| 支持格式(输入/输出) | 仅常用(png,jpeg,gif) | 非常丰富(webp, avif 等) |
| 渲染性能 | 较高(Rust),适中 | 极高(libvips),大批量优化 |
| 流式、批量操作 | 一般 | 强,擅长处理图片批量场景 |
| 动态生成(矢量、复杂场景) | 极强 | 有局限 需SVG或合成 |
| 前后端通用性 | API 接近浏览器 Canvas | 无法用于浏览器 |
3. 详细优缺点
@napi-rs/canvas
优点:
- 灵活性高:支持复杂文字样式(水印旋转、渐变、弯曲路径、阴影等)、自定义图形、矢量元素,非常适合对水印样式要求高的场景。
- API 熟悉度高:前端 Canvas 用户零学习成本。
- 安装简单:跨平台无编译坑,仅依赖 Rust。
- 图片合成流程自由:支持图层自由合成和多种绘制模式。
- 适合动态、交互式生成内容,如流水号、水印随内容变化等场景。
缺点:
- 图片格式有限:对HEIC/AVIF等新格式支持欠缺。
- 批量性能一般:一次启动一个 canvas 处理一张,比 sharp 批处理慢。
- 图片压缩尺寸控制弱:处理图片压缩参数不如 sharp 灵活。
- 不具备链式处理/流处理能力,难与 Node.js 流对接。
sharp
优点:
- 极高性能:大批量图片处理、IO受限场景优势明显。
- 丰富格式支持:PNG、JPEG、WebP、AVIF、GIF、TIFF 等输入/输出全覆盖。
- 批量与流式强大:可与 Node.js stream 等高效衔接,处理流程链式调用方便。
- 图片基础处理齐全:裁剪、缩放、旋转、压缩、转换等一步到位。
- 添加水印简单(图片/简单文本) :单图/固定样式水印可快速实现。
缺点:
- 复杂水印定制能力差:复杂文本样式(旋转、阴影),需走SVG或先输出图片文件。
- 文本水印不够灵活:无法直接“画”出复杂字体或特效,需SVG缓冲区方案绕过。
- API 语义偏底层:对前端开发者不如 canvas 直观。
- 图片内容动态绘制难:变化的矢量/路径水印等不适合 sharp。
4. 主要不同点
| 对比点 | @napi-rs/canvas | sharp |
|---|---|---|
| 灵活性 | 非常高,随意绘制、变形、特效 | 只适合简单图片/文本叠加 |
| 批量与流式 | 支持但不高效 | 极高效,易于大批量 |
| 安装难度 | 极低,无需C++编译 | 低,自动下载安装 libvips |
| 图片格式支持 | 常用格式 jpg/png/gif | 几乎市面所有流行图片格式 |
| 动态文本/矢量水印 | 非常方便 | 需生成SVG,受限 |
| 性能(单张) | 较高 | 很高 |
| 性能(批量/流式) | 一般 | 极佳 |
| 前端迁移能力 | 很强(API 共通) | 无法用于前端 |
| 生态稳定性 | 新兴、增长中 | 非常成熟,社区广 |
| 复杂组合/变换 | 支持各种(旋转、弯曲、缩放、透明度等) | 需依赖svg/图片,组合能力有限 |
5. 用途建议
- 简单水印、大批量处理、高性能服务器:
sharp - 水印样式复杂、多变、需精细控制:
@napi-rs/canvas - 需要支持多种图片格式输出:
sharp - 需要“像画画一样”灵活绘图:
@napi-rs/canvas - 需要文本特效、复杂排版等:
@napi-rs/canvas优于sharp
1.sharp
font-family="Arial, sans-serif"
npm i -g pnpm
pnpm i
pnpm build
npm rebuild --verbose sharp
FROM artifactory.chehejia.com/licloud-docker/base/run/node:18.12.1-buster-slim-artifactory
RUN mkdir -p /chj/app && chmod 775 -R /chj
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
build-essential \
python3 \
pkg-config \
libvips-dev \
fonts-liberation \
fonts-wqy-microhei \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /chj/app
ADD ./package.json ./pnpm-lock.yaml ./.npmrc /app/
ENV CHJ_BUILD_PATH=.
COPY ${CHJ_BUILD_PATH} .
RUN ls
RUN ls dist
CMD ["/bin/sh","-c","npm run start"]
2. @napi-rs/canvas
字体: '30px "WenQuanYi Micro Hei", "WenQuanYi Zen Hei", "Liberation Sans", sans-serif'
npm i -g pnpm
pnpm i
pnpm build
FROM artifactory.chehejia.com/licloud-docker/base/run/node:18.12.1-buster-slim-artifactory
RUN mkdir -p /chj/app && chmod 775 -R /chj
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
fonts-liberation \
fonts-wqy-microhei \
fontconfig \
&& fc-cache -f \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /chj/app
ADD ./package.json ./pnpm-lock.yaml ./.npmrc /app/
ENV CHJ_BUILD_PATH=.
COPY ${CHJ_BUILD_PATH} .
RUN ls
RUN ls dist
CMD ["/bin/sh","-c","npm run start"]