在Node.js中将EXIF数据写入图像流

3
我发现了一个很好的npm包,可以让你读取和写入图像的Exif数据:https://github.com/Sobesednik/node-exiftool
我的挑战是它需要你提供图像的路径。因此,如果您想使用此包修改EXIF,则必须将图像写入磁盘。是否有一种简单的方法来检查/读取EXIF,并在必要时将EXIF数据写入图像流?
var imageURL = 'https://nodejs.org/static/images/logos/nodejs-new-pantone-black.png'
var upstreamServer = 'http://someupstreamserver/uploads'

request
  .get(imageURL)
  .pipe(
      // TODO read EXIF
      // TODO write missing EXIF
      request
        .post(upstreamServer, function(err, httpResponse, body){
          res.send(201)
      })
  )

编辑:这个问题也在node-exiftool上被问到了。


我假设你也在"Sobesednik"的仓库上问了这个问题。如果没有:为什么不去问我们至少知道是专家的那个人呢?最好的情况是,你的问题会导致该库被扩展以与流一起使用,每个人都会受益。不仅仅是你。因为开源是为每个人而存在的。 - Mike 'Pomax' Kamermans
@Mike'Pomax'Kamermans 是的,我只是一个小时前发布了这个帖子,并将发布到他的存储库。不确定您评论的必要性。Stack Overflow向全世界开放。也许有人会指导我和其他读者找到更好的存储库或更好的方法来完成这项工作。 - tom
主要是因为“在发布之前搜索和研究”的政策 - 如果您在SO上提问,那么有什么比拥有一个这样的问题更好呢:“我也在node-exiftool存储库上提出了这个问题,在这里(然后在此处放置链接)”,因为现在当人们在下周、下个月甚至明年找到它时,我们就有了一个非常好的问题。它不再是一个死胡同,而是直接链接到最重要的地方。 - Mike 'Pomax' Kamermans
@Mike'Pomax'Kamermans 在发布之前我已经做了研究。我在原帖中也链接了仓库,但同意我可以在我的SO问题中添加这个问题也被提出在node-exiftool上。我的意图不是让这成为一个死胡同。如果我只在node-exiftool上提出问题,那么它将局限于该仓库和作者的回答。也许有更好的方法来实现我想要做的事情?这就是我发布这个问题的原因。当我找到答案时,我会在这里发布。 - tom
一个经典的阅读错误:我从未要求你做某事“而不是”在这里发布。正如你所指出的那样,那将是有限制的。我问你是否在存储库上询问了这个问题,因为在问题中包含这些信息(这有点意味着做两件事情)会使这个问题变得更好。你能否更改编辑内容,不要说“编辑:……”,而只说“我也在这里提出了这个问题(然后在此处链接到问题),如果在那里找到解决方案,我会更新这篇文章”的内容? - Mike 'Pomax' Kamermans
1个回答

1
我有一个类似的任务。我需要将物理尺寸和其他元数据写入PNG文件。我找到了一些解决方案,并将它们合并成一个小型库。 png-metadata 它可以从NodeJS缓冲区中读取PNG元数据,并创建带有新元数据的新缓冲区。
以下是一个示例:
        const buffer = fs.readFileSync('1000ppcm.png')
        console.log(readMetadata(buffer));

        withMetadata(buffer,{
            clear: true, //remove old metadata
            pHYs: { //300 dpi
                x: 30000,
                y: 30000,
                units: RESOLUTION_UNITS.INCHES
            },
            tEXt: {
                Title:            "Short (one line) title or caption for image",
                Author:           "Name of image's creator",
                Description:      "Description of image (possibly long)",
                Copyright:        "Copyright notice",
                Software:         "Software used to create the image",
                Disclaimer:       "Legal disclaimer",
                Warning:          "Warning of nature of content",
                Source:           "Device used to create the image",
                Comment:          "Miscellaneous comment"
            }
        });

它可以修改用于流,例如,您可以实现WritableBufferStream类。
const { Writable } = require('stream');

/**
 * Simple writable buffer stream
 * @docs: https://nodejs.org/api/stream.html#stream_writable_streams
 */
class WritableBufferStream extends Writable {

  constructor(options) {
    super(options);
    this._chunks = [];
  }

  _write(chunk, enc, callback) {
    this._chunks.push(chunk);
    return callback(null);
  }

  _destroy(err, callback) {
    this._chunks = null;
    return callback(null);
  }

  toBuffer() {
    return Buffer.concat(this._chunks);
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接