NodeJS child_process: разные результаты при использовании spawn и консоли

#node.js #linux #png #child-process #pngquant

Вопрос:

Я пытаюсь сжать изображение с pngquant помощью . Вот код:

 let output = '';  const quant = cp.spawn('pngquant', ['256', '--speed', '10'], {  stdio: [null, null, 'ignore'],  });   quant.stdout.on('data', data =gt; output  = data);   quant.on('close', () =gt; {  fs.writeFileSync('image.png', output);  fs.writeFileSync('image_original.png', image);  process.exit(0);  });   quant.stdin.write(image);  

image является a Buffer с чистыми данными PNG. Код работает, однако по какой-то причине он генерирует неверный PNG. Не только это, но и его размер больше, чем у оригинала.

Когда я выполняю это из терминала, я получаю отличный выходной файл:

 pngquant 256 --speed 10 lt; image_original.png gt; image.png  

Я понятия не имею, что происходит; данные в выходном файле кажутся довольно похожими на PNG.

ИЗМЕНИТЬ: Мне удалось заставить его работать:

 let output = [];  quant.stdout.on('data', data =gt; output.push(data)); quant.stdin.write(image);  quant.on('close', () =gt; {  const image = Buffer.concat(output);   fs.writeFileSync('image.png', image); });  

Я предполагаю, что это связано с тем, как строки представлены в NodeJS. Был бы рад получить какие-нибудь объяснения.

Комментарии:

1. Откуда это image берется?

2. @jfriend00 это происходит из stdin основного процесса; данные верны, потому что я также сохраняю их в виде файла PNG.

3. Итак, вы ждете, пока не получите все данные, stdin прежде чем выполнять какой-либо из этого кода?

4. ДА. Мне удалось заставить это работать, см. правку.

5. Обработка его как строки, вероятно, предполагает кодировку utf8, которая вызывает проблемы с чистыми двоичными данными. Как вы обнаружили, вы используете буферы для двоичных данных. К вашему сведению, вы просто передаете данные непосредственно в файл. Вам не нужно накапливать все это, прежде чем писать.