加载标准输出并将其解析为图像

时间:2017-11-15 19:08:44

标签: c# process stream graphviz

我有一个graphviz dot.exe文件,我用参数-Tpng调用(输出类型是png,但我不在乎它是否在png,bmp或其他任何内容中)。我用C#代码开始它:

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = path;
psi.UseShellExecute = false;
psi.Arguments = "-Tpng";
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
psi.CreateNoWindow = true;
Process p = Process.Start(psi);

然后,我写输入

p.StandardInput.WriteLine(input);
之前定义了

input,它是一个字符串。输入有效,手动测试。

然后,我需要读取graphviz打印到标准输出的输出并将其解析为Image

我试图读取内存流,但是我要么无法读取它,要么在读取后内存流被锁定(尝试Image.FromStream(myMemoryStream);时抛出异常)。 我能够将输出加载到字符串

string output = "";
while (true)
{
     string newOutput = p.StandardOutput.ReadLine();
     output += newOutput;
     if (newOutput == String.Empty)
        break;
}

我已尝试按照in this answer所述解析此字符串,但它引发了异常(字符串无效)。

如何从Image输出中获取dot.exe

1 个答案:

答案 0 :(得分:1)

从评论看来,程序似乎期望在返回内容之前完成StandardInput。关闭p.StandardInput.WriteLine(input); p.StandardInput.BaseStream.Close(); 以实现它:

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
var $ = require('jquery');

class App extends Component {

  loadData() {
    console.log("loading data");
        fetch('https://api.nytimes.com/svc/movies/v2/reviews/search.json?api-key=f90d8b6f90d04bb5bbbeb2f241155ce7&query=star wars')
            .then(response => response.json())
            .then(data => {
                this.setState({data: data });
        })
            .catch(err => console.error(this.props.url, err.toString()))
  }

  constructor(props) {
    super(props);
    this.state = { data: [] };
  }

  componentDidMount() {
    console.log('GrandChild did mount.');

      this.loadData()
  }
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <h1 className="App-title">Welcome to React</h1>
        </header>
        <p className="App-intro">
          To get started, edit <code>src/App.js</code> and save to reload.
        </p>
        <ul>
                {this.state.data(function(name, index){
                    return <li key={ index }>{name}</li>;
                  })}
            </ul>
      </div>


    );
  }
}

export default App;