从python子进程接收图像到节点,base64编码

时间:2016-06-07 15:28:38

标签: python node.js image encoding

我无法将从base64编码的图像从python子进程发送到节点。

我想:

  • 在节点中生成子进程以运行python文件
  • 从python打开图像
  • 旋转图像
  • 对图像进行编码
  • 通过stdout
  • 将编码的字符串返回给节点
  • 在节点中接收编码的字符串并将其写入图像文件。

python文件很简单:

import sys
from PIL import Image
import base64
import os

### Get image
inputFilePath = sys.argv[1]
img = Image.open(inputFilePath)

### Operate on image
img = img.rotate(180)

### Save image
img.save('temp_image.jpg')

### Convert image to base64
with open('temp_image.jpg','rb') as imageFile:
    encodedString = base64.b64encode(imageFile.read())

    ### Remove Temp file
    os.remove('temp_image.jpg')

    ### send the base64 string to parent process
    print(encodedString)

这应该将编码图像发送到父进程。

在节点中,我试图将编码的字符串写入图像文件。

var spawn = child.spawn(cmd, args);

var chunk = ''
spawn.stdout.on('data', function(data){
  chunk += data.toString();
});

spawn.stdout.on('close', function(data){
  fs.writeFile(destination, chunk, 'base64', function(err){
      console.log("err: " + err)
    });
  });
  console.log("Done");
});

我的问题:文件太小/已损坏。我不太确定如何解决它 - 任何帮助都会受到赞赏!

1 个答案:

答案 0 :(得分:0)

为什么要chunk + = data.toString()?

您收到的数据已经是字符串,根据您的python代码,您将整个图像打印出来,因此您不需要块+ =任何内容。

只需将stdout写入nodejs端的文件即可。

此外,如果spawn无效,您可以尝试使用childProcess.exec。确保查看NodeJS api文档。

    //or var or const
    let childProcess = require('child_process');

    childProcess.exec('python interface.py', function(error, stdout, stderr) {
        if (error !== null) {
            console.log(`exec error: ${error}`);
            //and handle the child process error maybe?
        }
        try {
            do.something.with.your.stdout() // replace this line with real code
        }
        catch (e) {
            // handle your error
        }
    });