#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, которая вызывает проблемы с чистыми двоичными данными. Как вы обнаружили, вы используете буферы для двоичных данных. К вашему сведению, вы просто передаете данные непосредственно в файл. Вам не нужно накапливать все это, прежде чем писать.