1

我正在使用 C# 应用程序中的 GnuPlot。我想直接从标准输出读取 GnuPlot PNG 输出,而不是保存到文件然后读取它。我的代码现在看起来像这样:

string Path = @"C:\Program Files\gnuplot\bin\gnuplot.exe";
Process GnuplotProcess = new Process();
GnuplotProcess.StartInfo.FileName = Path;
GnuplotProcess.StartInfo.UseShellExecute = false;
GnuplotProcess.StartInfo.RedirectStandardInput = true;
GnuplotProcess.StartInfo.RedirectStandardOutput = true;
GnuplotProcess.Start();
StreamWriter SW = GnuplotProcess.StandardInput;
StreamReader SR = GnuplotProcess.StandardOutput;
SW.WriteLine("set terminal pngcairo size 300,200");
foreach (LoadCaseOutput LCO in LoadCases)
{
    foreach (LoadCaseOutput.MemberOutput MO in LCO.Members)
    {
        SW.WriteLine("plot " + MO.GenerateAFEquation(P));
        MO.AFImage = Image.FromStream(SR.BaseStream);
    }
}
SW.WriteLine("exit");
GnuplotProcess.Close();

现在这似乎停滞在 Image.FromStream() 行。怎么了?

4

2 回答 2

1

更新(我已经更新了我的代码以反映我在下面的评论)

看来问题是当“退出”命令发送到 gnuPlot 时。如果没有向 gnuPlot 发送退出命令,程序就会等待。

我举了你的例子,并且能够通过在执行树中向上移动 gnuPlot exit 命令来完成程序。

        string Path = @"z:\tools\gnuplot\bin\gnuplot.exe";
        Process GnuplotProcess = new Process();
        GnuplotProcess.StartInfo.FileName = Path;
        GnuplotProcess.StartInfo.UseShellExecute = false;
        GnuplotProcess.StartInfo.RedirectStandardInput = true;
        GnuplotProcess.StartInfo.RedirectStandardOutput = true;
        GnuplotProcess.Start();
        StreamWriter SW = GnuplotProcess.StandardInput;
        StreamReader SR = GnuplotProcess.StandardOutput;
        SW.WriteLine("set terminal pngcairo size 300,200");
        SW.WriteLine("plot f(x) = sin(x*a), a = .2, f(x), a = .4, f(x)");
        SW.WriteLine("exit");

        Image png = Image.FromStream(SR.BaseStream);
        png.Save(@"z:\tools\try3a.png");

        GnuplotProcess.Close();

这确实正确地生成了一个 PNG 文件。为了测试,我确实尝试在发送退出命令之前从流中读取。程序等待 FromStream 调用。

马特

于 2013-03-29T19:59:12.587 回答
0

问题不在于读数,否则您会遇到异常,请将读数位替换为:

Image.FromStream(oFileStream, false, true)

它会在接收到第一个字节并从那里开始时立即验证图像。

于 2013-03-29T19:40:28.017 回答