将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 家庭,但除了管道。
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();