1

我正在尝试使用 Node.js gm库将两个图像叠加在一起。对于最终图像,avatar.png需要在bg.png. 这是我开始的代码:

const image = gm("bg.png")
    .composite("avatar.png");

这按它应该的方式工作,但我还需要将图像移动到一个x, yof 50, 50,所以我使用了这个geometry()函数:

const image = gm("bg.png")
    .composite("avatar.png")
    .geometry("+50+50");

下一个问题是我需要将图像放大到200x 200,所以我尝试了一些方法来做到这一点:

const image = gm("bg.png")
    .composite("avatar.png")
    .geometry("200x200+50+50");

这最终缩放bg.png到尽可能接近200x 200,同时仍然保留图像的纵横比。由于这不起作用,我尝试了这个:

const image = gm("bg.png")
    .composite("avatar.png")
    .resize("200x200")
    .geometry("+50+50");

这只是忽略了该resize()功能,根本没有缩放任何东西。交换的顺序,resize()geometry()没有做任何事情。

我怎样才能缩放avatar.png200x 200

4

2 回答 2

0

看起来任何被调用的函数都只适用于在构造函数中传递的图像,即使在调用复合之后也是如此。

您必须单独进行处理:

gm("bg.png")
  .geometry("+50+50")
  .toBuffer('PNG', function(err, buffer) {
    if (err) return handle(err);
    console.log('done!');
    gm(buffer, 'image.png')
      .composite('avatar.png')
      .geometry("200x200+50+50!")
      .write('output.png', function(err) {
        console.log(err);
      });
  });

祝你好运!

于 2019-11-13T20:10:45.537 回答
0

就像 Josh H 在他的回答中所说的那样,看起来我需要avatar.png单独调整大小,然后用bg.png. 这是我的最终代码:

gm("avatar.png")
    .resize(200, 200)
    .write("resizedAvatar.png", () => {
        gm("bg.png")
            .composite("resizedAvatar.png")
            .geometry("+50+50")
            .toBuffer("PNG", (err, buffer) => {
                // do whatever with `buffer`
            });

    });
于 2019-11-14T00:45:58.683 回答