C# 调用 gnuplot 作图并显示到界面 (一)

我需要完成的最后结果是使用C#调用gnuplot进行绘图并保存,然后将保存的图片显示到c#的 picturebox 中去。

1.关于gnuplot对数据文件进行画图

之前介绍了数据文件的产生,现在可以直接使用来作图。在"a.dat"所在的目录下,对gnuplot.exe输入命令:

    plot "a.dat" w l
    set terminal gif
    set output "a.gif"
    replot
    set output

2.C#调用gnuplot

首先需要加入引用:

using System.Diagnostics; 

代码:

Process process = new Process(); //创建一个进程
process.StartInfo.FileName = "gnuplot.exe";      //设置要启动的应用程序
process.StartInfo.UseShellExecute = false;       //是否使用外壳程序
process.StartInfo.CreateNoWindow = true;         //是否在新窗口中启动该进程的值(不显示程序窗口) 
process.StartInfo.RedirectStandardInput = true;  //重定向输入流(输入信息) 
process.StartInfo.RedirectStandardOutput = true; //重定向输出流(输出信息)
process.StartInfo.RedirectStandardError = true;  //重定向错误流(输出错误)

//启动程序
process.Start();

//命令
string str ="XXXX";

//向命令窗口发送输入信息
process.StandardInput.WriteLine(str + "&exit");

process.StandardInput.AutoFlush = true;

//等待程序执行完退出进程
process.WaitForExit();
process.Close();

3.将图片显示到 picturebox 中

先在窗口中加入picturebox控件,设置属性SizeMode 为 StretchImage,也就是让图片适应控件大小,可以完全显示图片。

显示图片文件的代码为:

pictureBox1.Image = Image.FromFile("D:\\a.gif");  

这里遇到一个问题,在C#中使用Image.FromFile(string path)方法经常会报内存不足的错误,需要在使用后及时进行资源释放才能有效缓解该部分内存问题。

 System.Drawing.Image img = System.Drawing.Image.FromFile("D:\\a.gif");  //将图片转化为流
 pictureBox1.Image = Image.FromFile("D:\\a.gif");
 img.Dispose();   //关闭流,释放内存

4.代码实现

以对Hata模型进行绘图为例,先在Form3中选择参数并输入区间,然后传输参数到Form8,进行数据显示以及作图。

(1)首先建立一个类picturedata.cs,存放需要传输的参数:

class picturedata
{ 
    //用于选择作图方式
    public static string data;

    //Hata模型参数
    public static string f_c;    //频率
    public static string h_te;   //发射站天线高度
    public static string h_re;   //移动台天线高度
    public static string d;      //距离
        
    //初值终值
    public static string start;
    public static string end;
}

(2)在Form3中进行对应参数传递:
在这里插入图片描述
代码:

private void Btn_graph_Click(object sender, EventArgs e)
{
     //参数传递
     if (Rad_fc.Checked)
      {
           picturedata.data = "1";
       }
      else if (Rad_Hte.Checked)
       {
           picturedata.data = "2";
      }
        else if (Rad_distance.Checked)
        {
           picturedata.data = "3";
        }
        
      //固定值
           picturedata.f_c = Txt_Fc.Text;
           picturedata.h_te = Txt_Hte.Text;
           picturedata.h_re =Txt_Hre.Text;
           picturedata.d = Txt_d.Text;
      //初值终值
           picturedata.start = Txt_start.Text;
           picturedata.end = Txt_end.Text;
        
      //嵌入子窗口Form8
      Form1.frm1.label5_Click(sender, e);
}

关于Form8的嵌入函数(在Form1里加一个label):

public void label5_Click(object sender, EventArgs e)
{           
     this.panelAdd.Controls.Clear();
     Form8 form = new Form8();
     form.FormBorderStyle = FormBorderStyle.None;
     form.TopLevel = false;
     this.panelAdd.Controls.Add(form);
     form.Show();
}  

(3)Form8中进行绘图和数据显示

产生数据文件:

private void Form8_Load(object sender, EventArgs e)
{     
     //读取pictureata.cs中的变量picturedata
     int i = Convert.ToInt32(picturedata.data);
    
      //读取参数值
      int h_te = Convert.ToInt32(picturedata.h_te);
      int h_re = Convert.ToInt32(picturedata.h_re);
      int d =Convert.ToInt32(picturedata.d);
      int f_c = Convert.ToInt32(picturedata.f_c);
                
    
      //读取初始值与终值
      int start = Convert.ToInt32(picturedata.start);
      int end = Convert.ToInt32(picturedata.end);
    
      //选择对应公式完成计算,输出到textbox
      double L=0;
      switch (i)
      {
           //Hata模型频率
            case 1:
            for (f_c = start; f_c <= end;)
            {
                f_c = f_c+(end - start) / 10;      //计算十组数据
                L = 69.55 + 26.16 * (Math.Log10(f_c)) - 13.82 * (Math.Log10(h_te)) - (3.2 * (Math.Log10(11.75 * h_re)) * (Math.Log10(11.75 * h_re)) - 4.97) + (44.9 - 6.55 * (Math.Log10(h_te))) * (Math.Log10(d));
                Txt_data.Text += f_c.ToString();
                Txt_data.Text += " ";
                Txt_data.Text += L.ToString("0.00");//保留两位小数
                Txt_data.Text += "\r\n";
            }
            break;
            //Hata模型发射站天线高度
            case 2:
            for (h_te = start; h_te <= end;)
            {
                h_te = h_te+(end - start) / 10;
                L = 69.55 + 26.16 * (Math.Log10(f_c)) - 13.82 * (Math.Log10(h_te)) - (3.2 * (Math.Log10(11.75 * h_re)) * (Math.Log10(11.75 * h_re)) - 4.97) + (44.9 - 6.55 * (Math.Log10(h_te))) * (Math.Log10(d));
                Txt_data.Text += h_te.ToString();
                Txt_data.Text += " ";
                Txt_data.Text += L.ToString("0.00");//保留两位小数
                Txt_data.Text += "\r\n";
            }
            break;
            //Hata模型距离
            case 3:
            for (d = start; d <= end;)
            {
                d = d + (end - start) / 10;
                L = 69.55 + 26.16 * (Math.Log10(f_c)) - 13.82 * (Math.Log10(h_te)) - (3.2 * (Math.Log10(11.75 * h_re)) * (Math.Log10(11.75 * h_re)) - 4.97) + (44.9 - 6.55 * (Math.Log10(h_te))) * (Math.Log10(d));
                Txt_data.Text += d.ToString();
                Txt_data.Text += " ";
                Txt_data.Text += L.ToString("0.00");//保留两位小数
                Txt_data.Text += "\r\n";
            }
            break;
      }
        
      //产生数据文件
      FileStream fs = new FileStream(@"a.dat", FileMode.Create);     //支持文件读写
      BinaryWriter bw = new BinaryWriter(fs);    //二进制输入
      bw.Write(System.Text.Encoding.Default.GetBytes(this.Txt_data.Text));//转化为二进制写入文件
      bw.Flush();//清理缓冲器
      bw.Close();
      fs.Close(); 
}

调用gnuplot作图:

private void button1_Click(object sender, EventArgs e)
{
      Process process = new Process(); //创建一个进程
      process.StartInfo.FileName = "gnuplot.exe";      //设置要启动的应用程序
      process.StartInfo.UseShellExecute = false;       //是否使用外壳程序
      process.StartInfo.CreateNoWindow = true;         //是否在新窗口中启动该进程的值(不显示程序窗口) 
      process.StartInfo.RedirectStandardInput = true;  //重定向输入流(输入信息) 
      process.StartInfo.RedirectStandardOutput = true; //重定向输出流(输出信息)
      process.StartInfo.RedirectStandardError = true;  //重定向错误流(输出错误)
      process.Start();//启动程序

     //向命令窗口发送输入信息
     process.StandardInput.WriteLine("plot 'a.dat' w l");
     process.StandardInput.WriteLine("set serminal gif");
     process.StandardInput.WriteLine("set output 'a.gif'");
     process.StandardInput.WriteLine("replot");
     process.StandardInput.WriteLine("set output");
     process.StandardInput.AutoFlush = true;
     process.StandardInput.WriteLine("&exit");
     
     //获取命令窗口的输出信息
     string output = process.StandardOutput.ReadToEnd();

      //等待程序执行完退出进程
      process.WaitForExit();
      process.Close();

      Console.WriteLine(output);   //显示输出信息
      Console.ReadLine();          //读取信息

     //将图片加载到picturebox
     System.Drawing.Image img = System.Drawing.Image.FromFile("a.gif");
     pictureBox1.Image = Image.FromFile("a.gif");
     img.Dispose();
}

5.运行结果
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值