Javascript 将EXIF数据写入image stream Node.js

Javascript 将EXIF数据写入image stream Node.js,javascript,node.js,stream,stdout,exif,Javascript,Node.js,Stream,Stdout,Exif,我发现了一个很好的npm包,它允许您将Exif数据读写到图像 我面临的挑战是,它需要您提供图像的路径。因此,如果要使用此软件包修改EXIF,必须将映像写入磁盘。是否有一种简单的方法来检查/读取EXIF,并在必要时将EXIF数据写入图像流 var imageURL = 'https://nodejs.org/static/images/logos/nodejs-new-pantone-black.png' var upstreamServer = 'http://someupstreamserve

我发现了一个很好的npm包,它允许您将Exif数据读写到图像

我面临的挑战是,它需要您提供图像的路径。因此,如果要使用此软件包修改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)
      })
  )

编辑:这个问题也在NodeExifTool上被问到,我也有类似的任务。我必须将物理维度和附加元数据写入PNG文件。我找到了一些解决方案,并将其合并到一个小库中。

它可以从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);
  }
}

我猜你也在索贝塞德尼克的回购协议上问过这个问题。如果不是:为什么你不问我们至少认识的一个人是专家?最好的情况是,您的问题导致库扩展到使用流,并且每个人都赢了。不仅仅是你。因为开源是为每个人准备的。@Mike'Pomax'Kamermans是的,我一个小时前才发布了这篇文章,将发布到他的回购协议中。不过,我不确定是否需要你的评论。堆栈溢出是向世界开放的。也许有人会指导我和其他阅读本文的人找到更好的回购协议或更好的方法。主要是因为“发布前搜索和研究”的政策——如果你这样问,还有什么比提出这样一个问题更好的呢:“我在node exiftool存储库上也问了这个问题,在(然后是这里的链接)”,因为现在我们有一个非常好的问题,当人们在下周,下个月,甚至明年找到它的时候。它不会成为一条死胡同,而是直接链接到你可以链接到的最重要的地方。@Mike'Pomax'Kamermans我在发布之前研究过这个。我在我的原始帖子中链接到了回购协议,但我同意我可以添加到我的问题中,这个问题也在node exiftool上被问到了。我的意图不是让这成为一条死胡同。如果我只是在node exiftool上问这个问题,那么它将仅限于该回购协议和作者的回复。也许有更好的方法来做我想做的事情?这就是为什么我发布了这个问题。当我找到答案时,我会把它贴在这里。一个典型的阅读错误:我从来没有要求你做什么而不是贴在这里。正如你正确指出的那样,这将是有限的。我问你是否在回购协议上问过这个问题,因为在问题中有这些信息(这意味着同时做这两件事)会让这个问题变得更好。你能不能把编辑改成不说“编辑:…”,只说“我也问了这个问题(然后是这个问题的链接),如果找到了解决方案,我会用答案更新这篇文章”之类的?