代码之家  ›  专栏  ›  技术社区  ›  Alex028502

在节点内运行imagemagick convert时图像已损坏。js,然后将结果通过管道传输到文件

  •  0
  • Alex028502  · 技术社区  · 4 年前

    这是一个名为 test-program.js

    const util = require('util');
    const exec = util.promisify(require('child_process').exec);
    
    (async function() {
      const cmd = `convert -background red -fill black -gravity center -size 50x50 label:':)' jpg:-`;
      const result = await exec(cmd);
      console.log(result.stdout);
    })();
    

    我试着这样运行它

    node test-program.js > test.jpg
    

    enter image description here

    但是,如果我在命令行上正确运行它,如下所示:

    convert -background red -fill black -gravity center -size 50x50 label:':)' jpg:- > test.jpg
    

    enter image description here

    这里有两个版本的程序 按预期工作:

    使用节点调用命令,但使命令直接写入文件

    const util = require('util');
    const exec = util.promisify(require('child_process').exec);
    
    (async function() {
      const cmd = `convert -background red -fill black -gravity center -size 50x50 label:':)' test.jpg`;
      const result = await exec(cmd);
      console.log(result.stdout);
    })();
    

    只需使用更简单的命令将“hello”写入文件:

    const util = require('util');
    const exec = util.promisify(require('child_process').exec);
    
    (async function() {
      const cmd = `echo hello`;
      const result = await exec(cmd);
      console.log(result.stdout);
    })();
    

    因此,我非常确定该命令正在按它应该的方式执行,它正在生成它应该生成的输出,并且包装器通常会将输出毫无问题地写入stdout。(或者在末尾加一行)

    0 回复  |  直到 4 年前
        1
  •  3
  •   Alex028502    4 年前

    如果它对任何人都有帮助,则需要进行两项更改以使其在节点12上工作:

    const result = await exec(cmd, {encoding: null}); // enconding: null
    process.stdout.write(result.stdout); // instead of console log
    

    这样地:

    const util = require('util');
    const exec = util.promisify(require('child_process').exec);
    
    (async function() {
      const cmd = `convert -background red -fill black -gravity center -size 50x50 label:':)' jpg:-`;
      const result = await exec(cmd, {encoding: null});
      process.stdout.write(result.stdout);
    })();