使用 Sharp Node.js 保留旋转元数据

use*_*441 2 javascript sharp

我正在开发一个使用Sharp处理照片的应用程序。目前,当我们调整大小,然后使用锐调整大小和 toBuffer 写入缓冲图像时,默认情况下,两者都会擦除 EXIF 数据。我们想要删除除方向之外的所有元数据(如果存在)。

我已经阅读了 Sharp 的文档,withMetadata 似乎是实现我想要的目标的候选者,问题是 withMetadata 保留了所有元数据,而我只想要原始图像的方向。

原来的代码行是

await this.sharpInstance.resize(maxDimension, maxDimension).max().toBuffer()

我想我想要的是这样的

await this.sharpInstance.withMetadata().resize(maxDimension, maxDimension).max().withMetadata().toBuffer()

但仅适用于方向元数据。

我真的很感激一些帮助来解决这个问题。非常感谢!

Gon*_*gui 7

对于那些对保留文件的原始旋转加上旋转元数据不特别感兴趣的人来说,解决方法是:旋转图像,使文件没有元数据,但旋转是正确的。

为此,不需要读取元数据,如果您调用rotate()不带参数的方法,它将查找元数据中的信息并执行适当的轮换。


Nha*_*ang 6

您是否尝试过await this.sharpInstance.resize(maxDimension, maxDimension).max().withMetadata().toBuffer()像夏普文档一样关于withMetadata.

编辑:

我明白了。因此withMetadata,首先我们需要保存方向元数据,然后分配给输出缓冲区:

// First, save the orientation for later use
const { orientation } = await this.sharpInstance.metadata();

// Then output to Buffer without metadata
// then create another Sharp instance 
// from output Buffer which doesn't have metadata
// and assign saved orientation along with it
sharp(this.sharpInstance.toBuffer())
    .withMetadata({ orientation }).toBuffer();
Run Code Online (Sandbox Code Playgroud)