将2个stdin参数传递给ImageMagick child_process [英] Passing 2 stdin arguments to a ImageMagick child_process

查看:145
本文介绍了将2个stdin参数传递给ImageMagick child_process的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些限制,我不会指定要求我使用ImageMagick作为子进程。

I have certain limitations that I won't specify that require me to use ImageMagick as a child-process.

我有多个基本的64个jpg文件字符串我想要ImageMagick来处理。
具体来说,我希望ImageMagick将jpg文件加入到一起。如果我有2个常规jpg文件,那么从命令行我将使用以下格式。

I have multiple base 64 strings of jpg files which I want ImageMagick to process. Specifically I want ImageMagick to join the jpg files together. If I had 2 regular jpg files then from the command line I would use the following format.

node convert in_1.jpg in_2.jpg +append out.jpg

在js文件中我会用

var spawn, magicCommands, imagic;
spawn = require('child_process').spawn;
magicCommands = ["in_1.jpg",
                 "in_2.jpg",
                 "+append",
                 "out.jpg"];
imagic = spawn("convert", magicCommands);

现在,如果我想使用 1 stdin缓冲区,以下内容将起作用

Now if I wanted to use 1 stdin buffer the following would work

    var arrow1JpgBase64, arrow2JpgBase64, arrowBuffer1, arrowBuffer2, magicCommands, imagic;

    spawn = require('child_process').spawn;
    exec = require('child_process').exec;

    arrow1JpgBase64 = "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAAFAAkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1/wCFngjxJba78QbWT4reLTLH4pZ2mjt9PLTCSxs5VL+bbSYZUkWPCFUxGu1EHFdz/wAIb4j/AOiseM//AAF0n/5BoooA/9k=";
    arrow2JpgBase64 = "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCAAFAAkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1/wCOvgjxJc/Dt7NPit4tMt1q+k20Ty2+nqsLyajbIkoMFtFJuRmDjbIpyo5xmu5/4Q3xH/0Vjxn/AOAuk/8AyDRRQB//2Q==";
    arrowBuffer1 = new Buffer(arrow1JpgBase64, 'base64');
    arrowBuffer2 = new Buffer(arrow2JpgBase64, 'base64');
    magicCommands = ["jpg:",
                     "in_2.jpg",
                     "+append",
                     "out.jpg"];

    imagic = spawn("convert", magicCommands);
    imagic.stdin.write(arrowBuffer1);
    imagic.stdin.end();

    imagic.on('exit', function (code) {
        if (code === 0) {
            exec("open out.jpg");
        } else {
            console.log("error code: " + code);
        }
    }); // end of on exit

到目前为止一切顺利,但我想使用 both 缓冲区而不只是 1 。因此,如果我将in_2.jpg,行替换为jpg:,,那么我该如何处理更改脚本的其余部分以使其工作?

So far so good, but I want to use both of the buffers and not just 1 of them. So if I replace the "in_2.jpg", line with "jpg:", then how do I have to change the rest of the script to get it to work?

谢谢

推荐答案

正如Mark Setchell在评论中指出的那样,使用ImageMagick的 fd:协议将起作用。

As Mark Setchell pointed out in the comments, using ImageMagick's fd: protocol will work.

var spawnOptions = {
      stdio: [
        0, // stdin,
        1, // stdout
        2, // stderr
        'pipe', // arrowBuffer1
        'pipe'  // arrowBuffer2
      ]
};
magic = spawn("convert", magicCommands, spawnOptions);

这将打开 fd:3 &管道的 fd:4 node.js <我没有失败/ a>家庭,但除了管道

This opens fd:3 & fd:4 for piping. I'm not failure with the node.js family, but there usually a way to pass a resource in addition to pipe.

代码

更新 magickCommands 从新的 fd 中读取的变量,并直接写入新的管道

Update the magickCommands variable to read from new fd's, and write directly to new pipes

magicCommands = ["fd:3",
                 "fd:4",
                 "+append",
                 "out.jpg"];

// ...
imagic.stdio[3].write(arrowBuffer1);
imagic.stdio[4].write(arrowBuffer2);
imagic.stdio[3].end();
imagic.stdio[4].end();

这篇关于将2个stdin参数传递给ImageMagick child_process的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆