我想分享一下我使用 Node 包管理器 (NPM) 中的 Sharp 库处理 heic 扩展名图片的经验。首先,我们来谈谈遇到的问题。
背景 有很多问题。首先是为什么?为什么我得介意.heic延期?
这个问题源于iPhone用户,他们在使用相机时将此.heic扩展程序作为图像的输出。这种行为与通常输出.jpeg或 的Android 手机不同.jpg。
这确实让事情变得复杂,backend因为browsers扩展程序通常不支持.heic开箱即用。作为一名后端工程师,我负责将浏览器不支持的图片转换为广泛兼容的图片,此外,我还必须调整图片大小,以便它在浏览器上显示时加载速度更快。此外,我的大多数客户都使用 iPhone,这确实是一个需要考虑的问题。
所以,我不得不将其转换为.jpeg或.webp。当时,我对.webp结果有点问题,例如,图像由于某种原因被旋转了 90 度,我认为这可以通过调用 Sharp 库中的 rotate() 方法轻松解决。最后,我决定继续使用 ,.jpeg同时保留 EXIF 元数据以保留旋转和其他元数据。
另一个问题是 Sharp 库本身不支持转换.heic扩展名。那么,在这种情况下我该怎么办?
解决方案 快速阅读完sharp's文档后,我决定继续使用这个sharp库,我很高兴地发现它可能能够处理带有heic扩展名的文件。这是可能的,因为 Sharp 实际上使用了一个名为libvips“底层后端”的库来处理图像。
Libvips 支持 heic,但为什么我的 Sharp 库不支持它?
我们已经知道sharp正在使用libvips。当我们使用sharp来安装库时npm install sharp,它还会下载node_modules目录中的 libvips 二进制文件并sharp使用该二进制文件,但它对图像扩展的支持有限。为了使其支持更广泛的环境,我们可以手动自定义安装 libvips,也就是从源代码构建libvips。
让它发挥作用! 要达到这个目标需要很多步骤。具体步骤如下:
安装构建工具。 安装ninja& meson(从源代码构建) 安装libvips及其依赖项 测试libvips安装 安装sharp及其依赖项 让我们开始吧(我假设您使用 Debian Linux 发行版)。
我强烈建议您使用带有 Debian 镜像的 Docker 容器;我将Dockerfile在下面提供完整的镜像。
- 安装构建工具 我们将在这里安装 git、Python 和其他必要的构建工具。
Install dependencies
sudo apt-get update &&
sudo apt-get install -y curl python3 git build-essential pkg-config
2. 安装 ninja 和 meson(从源代码构建)
我们ninja先安装
Install ninja
git clone --branch=v1.12.1 --depth=1 github.com/ninja-build… &&
cd ninja &&
./configure.py --bootstrap &&
chmod +x ninja &&
sudo mv ninja /usr/local/bin/ninja
安装介子
Install meson
git clone --branch=1.6.1 --depth=1 github.com/mesonbuild/… &&
cd meson &&
./packaging/create_zipapp.py --outfile meson.pyz --interpreter '/usr/bin/env python3' &&
chmod +x meson.pyz &&
sudo mv meson.pyz /usr/local/bin/meson
完成,进入第 3 步
3.安装libvips及其依赖项
install runtime dependencies
sudo apt-get update &&
sudo apt-get install -y
curl python3 build-essential git pkg-config libglib2.0-dev libexpat1-dev libheif-dev
liblcms2-dev libjpeg-dev libpng-dev libwebp-dev libexif-dev
Build libvips
git clone --branch=v8.16.0 --depth=1 github.com/libvips/lib… &&
cd libvips &&
meson setup build --prefix /usr/local &&
cd build &&
meson compile &&
meson test &&
meson install &&
sudo ldconfig &&
cd .. &&
rm -rf libvips
3.测试libvips安装
此时,您已经libvips在机器上安装了,您可以测试它是否正确安装。
vips --version 4.安装sharp及其依赖项 安装 node-addon-api
npm install node-addon-api@^8.1.0 安装 node-gyp
npm install node-gyp@^11.0.0 最后安装 sharp
npm install sharp@^0.33.5 --build-from-source Dockerfile 我假设您已经在 package.json 文件中包含了 node-gyp、node-addon-api 和 sharp。
{ "dependencies": { "node-addon-api": "^8.1.0", "node-gyp": "^11.0.0", "sharp": "^0.33.5" } } Dockerfile 如下所示:
Stage 1
FROM debian:bookworm-slim AS builder
WORKDIR /build
Install dependencies
RUN apt-get update &&
apt-get install -y curl python3 git build-essential pkg-config &&
rm -rf /var/lib/apt/lists/*
Install ninja
RUN git clone --branch=v1.12.1 --depth=1 github.com/ninja-build… &&
cd ninja &&
./configure.py --bootstrap &&
chmod +x ninja &&
mv ninja /usr/local/bin/ninja
Install meson
RUN git clone --branch=1.6.1 --depth=1 github.com/mesonbuild/… &&
cd meson &&
./packaging/create_zipapp.py --outfile meson.pyz --interpreter '/usr/bin/env python3' &&
chmod +x meson.pyz &&
mv meson.pyz /usr/local/bin/meson
Stage 2
FROM debian:bookworm-slim
Install runtime dependencies
RUN apt-get update &&
apt-get install -y
curl python3 build-essential git pkg-config libglib2.0-dev libexpat1-dev libheif-dev
liblcms2-dev libjpeg-dev libpng-dev libwebp-dev libexif-dev &&
curl -fsSL deb.nodesource.com/setup_23.x | bash - &&
apt install -y nodejs
Copy build tools from builder stage
COPY --from=builder /usr/local/bin/ninja /usr/local/bin/ninja COPY --from=builder /usr/local/bin/meson /usr/local/bin/meson
Build libvips
RUN git clone --branch=v8.16.0 --depth=1 github.com/libvips/lib… &&
cd libvips &&
meson setup build --prefix /usr/local &&
cd build &&
meson compile &&
meson test &&
meson install &&
ldconfig &&
cd .. &&
rm -rf libvips
Remove unused build tools
RUN apt-get purge -y git && apt-get autoremove -y &&
rm -rf /var/lib/apt/lists/* /usr/local/bin/ninja /usr/local/bin/meson
WORKDIR /app
RUN --mount=type=bind,src=package.json,target=package.json
--mount=type=bind,src=package-lock.json,target=package-lock.json
npm ci --build-from-source
COPY . .
Build the application
RUN npm run build || true
Remove source code
RUN rm -rf ./src
EXPOSE 3000
ENTRYPOINT [ "npm", "start" ] 结论 默认的 sharpjs 包不包含支持 heic 的 vips,需要开发者从源代码构建具有更广泛支持的 vips 作者www.mjsyxx.com