我有一个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
?
答案 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;