nodejs给图片添加水印 部署线上异常

138 阅读4分钟

sharp或@napi-rs/canva

写代码很简单,但是我部署到线上就构建失败 没有水印内容 没有中文字符 sharp包找不到 中文显示乱码等等问题 最后成功运行的dockerfile放在最下面和对应的字体

最后用了@napi-rs/canva 因为觉得sharp还要安装非常多东西

比较如下(gpt生成)

1. 基本介绍

@napi-rs/canvassharp
技术栈Rust 写的 Node.js Canvas API 实现,前端风格基于 C/C++ libvips 库的高性能 Node.js 图像处理库
用法风格像前端 Canvas2D 那样绘图声明式、链式调用,面向图片整体处理
安装依赖纯 Node-Rust,依赖极少,无需本地编译环境依赖 libvips,自动安装,但体积略大

2. 功能对比

功能@napi-rs/canvassharp
图片水印(图片叠加)支持(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/canvassharp
灵活性非常高,随意绘制、变形、特效只适合简单图片/文本叠加
批量与流式支持但不高效极高效,易于大批量
安装难度极低,无需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"]