【问题标题】:Keep rotation metadata with sharp node.js使用清晰的 node.js 保留旋转元数据
【发布时间】:2020-10-09 21:44:09
【问题描述】:

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

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

原来的代码行是

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

我认为我想要的是类似的东西

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

但仅适用于方向元数据。

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

【问题讨论】:

    标签: javascript sharp


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您是否尝试过将await this.sharpInstance.resize(maxDimension, maxDimension).max().withMetadata().toBuffer() 用作夏普docs 关于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();
      

      【讨论】:

      • 这个问题是它会保留所有现有的元数据,但我需要删除除方向之外的所有元数据
      • 完美!这正是我一直在寻找的。我很困惑,并认为 withMetadata 保留了所有属性。感谢您的帮助!
      • 我唯一的疑问是,为什么不直接保存原始方向后呢: await this.sharpInstance.withMetadata({orientation}).resize(maxDimension, maxDimension).max().toBuffer() ?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 2021-05-27
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      相关资源
      最近更新 更多