拿到任务之后首先分成了几个部分:

1.绘图。学习了GDI+

2.图片保存。

3.将图片转换成byte[]。由于使用Socket通信,只能传输byte[]数据,所以这一步是向下位机传输的关键。

相应地,编程实现了下面几个功能:

1.使用GDI+画图并保存为bmp格式的图片。画图部分是书上的例子,只增加了保存的相应代码。

  1. public partial class Form1 : Form
  2. {
  3. Bitmap bitmap;
  4. Font myFont = new Font("Arial", , FontStyle.Bold);//定义字符串的样式
  5. Rectangle ret = new Rectangle(, , , );//实例化
  6. public Form1()
  7. {
  8. InitializeComponent();
  9. }
  10.  
  11. private void button1_Click(object sender, EventArgs e)
  12. {
  13. bitmap = new Bitmap(panel1.Width, panel1.Height);//用于保存
  14. this.panel1.BackgroundImage = bitmap;
  15.  
  16. int tem_Line = ;//圆的直径
  17. int ci_L = ;//画笔
  18. if (panel1.Width >= panel1.Height)
  19. {
  20. tem_Line = panel1.Height;
  21. }
  22. else
  23. tem_Line = panel1.Width;
  24. ret = new Rectangle(ci_L, ci_L, tem_Line - ci_L * , tem_Line - ci_L * );
  25. Font Star_font = new Font("Arial", , FontStyle.Regular);
  26. string star_str = "*";
  27.  
  28. Graphics g = Graphics.FromImage(bitmap);
  29. //Graphics g = this.panel1.CreateGraphics();//实例化画图类
  30. g.SmoothingMode = SmoothingMode.AntiAlias;//消除绘制的锯齿,作用比较明显
  31. g.Clear(Color.White);//以白色清空panel1控件的背景
  32. Pen myPen = new Pen(Color.Red, ci_L);//定义画笔
  33. g.DrawEllipse(myPen, ret);//画椭圆(绘制圆)
  34.  
  35. SizeF mySize = new SizeF(ret.Width, ret.Width);//实例化SizeF类 存储有序浮点数对,通常为矩形的宽度和高度。
  36. mySize = g.MeasureString(star_str, Star_font);//对指定字符串进行测量(测量什么??????)
  37. g.DrawString(star_str, Star_font, myPen.Brush, new PointF((ret.Width / 2F) + ci_L - mySize.Width / 2F,
  38. ret.Height / 2F - mySize.Width / 2F));//在指定的位置绘制
  39.  
  40. mySize = g.MeasureString("专用", myFont);
  41. g.DrawString("专用", myFont, myPen.Brush, new PointF((ret.Width / 2F) + ci_L - mySize.Width / 2F,
  42. ret.Height / 2F + mySize.Width / 2F));//在指定的位置绘制
  43. string tem = "testing";
  44. int len = tem.Length;
  45. float angle = + ( - len * ) / ;
  46.  
  47. for (int i = ; i < len; i++)//将文字以指定的弧度进行绘制
  48. {
  49. g.TranslateTransform((tem_Line + ci_L / ) / , (tem_Line + ci_L / ) / );
  50. g.RotateTransform(angle);//将指定的旋转用于Graphics类的变换矩阵??????????????
  51. Brush myBrush = Brushes.Red;
  52. g.DrawString(tem.Substring(i, ), myFont, myBrush, , );
  53. g.ResetTransform();//将Graphics类的全局变换矩阵重置为单位矩阵?????????
  54. angle += ;//设置下一个文字的角度
  55. }
  56. bitmap.Save(@"D:\myImage123.bmp", ImageFormat.Bmp);
  57. }
  58. }

2.将图片转换成byte[]

  1. public partial class Form1 : Form
  2. {
  3. public Form1()
  4. {
  5. InitializeComponent();
  6. }
  7. Bitmap bitmap;
  8. byte[] imageBytes;
  9. MemoryStream ms;
  10. private void button1_Click(object sender, EventArgs e)//打开图片
  11. {
  12. openFileDialog1.Filter = "*.bmp|*.bmp";
  13. if (openFileDialog1.ShowDialog() == DialogResult.OK)
  14. {
  15. if (bitmap != null)
  16. bitmap.Dispose();
  17. string fileName = openFileDialog1.FileName;
  18. bitmap = new Bitmap(fileName);
  19. /*if (bitmap.Width > bitmap.Height)//如果 图片 的宽度大于高度
  20. {
  21. pictureBox1.Width = panel1.Width;//设置控件的宽度
  22. pictureBox1.Height = (int)((double)bitmap.Height * panel1.Width / bitmap.Width);
  23. }
  24. else
  25. {
  26. pictureBox1.Height = panel1.Width;
  27. pictureBox1.Width = (int)((double)bitmap.Height * panel1.Width / bitmap.Width);
  28. }*/
  29. pictureBox1.Image = bitmap;//显示图片
  30.  
  31. }
  32. }
  33.  
  34. private void button2_Click(object sender, EventArgs e)
  35. {
  36. Image myImage = bitmap;//注意
  37. ms = new MemoryStream();
  38. imageBytes = new byte[ms.Length];//关于字节数组大小!!!!
  39. myImage.Save(ms,ImageFormat.Gif);//存储到流
  40. imageBytes=ms.ToArray();//将转换之后的结果赋值
  41. richTextBox1.AppendText("长度:" + imageBytes.Length);
  42. foreach (byte b in imageBytes)
  43. {
  44. richTextBox1.AppendText("转换之后的数据:" + b+"\r\n");
  45. }
  46. }
  47.  
  48. private void button3_Click(object sender, EventArgs e)
  49. {
  50. MemoryStream ms = new MemoryStream(imageBytes);
  51. Image returnImage = Image.FromStream(ms);
  52. pictureBox2.Image= returnImage;//显示图片
  53. }
  54. }

  至此,绘图、保存、转换都已经正确实现。

  回归到最初的任务:画正弦函数曲线,并将数据传输给下位机(ARM),经下位机处理后将数据传回,并显示。要求上位机在画曲线时用户可以改变参数(这里设定的可变参数有幅度、周期、初相),参数改变就意味着有参照,而不是单一画出正弦函数图形,所以,必须添加坐标。最初研究添加坐标时,考虑的无非就是画坐标线,然后添加图形,但是这样的效果是无法将坐标与图形联系起来。为解决此问题,考虑了两种方案:固定坐标线,调整图像与坐标线建立联系;固定图形,让坐标去适应图形。这里需要说明的是,此时我考虑的这种所谓“坐标线”只是根据绘图区大小而画的直线,并非实际意义上的坐标系!当然这两种方案都没有实现,因为在研究过程中关注到了另外的组件:zedGraph。所以接下来的实现已经转移到这上面。

  目前的效果:在zedGraph中绘制参数可变的正弦函数图像(含参考图像),然后保存为bmp格式的图片。这样加入之前将图片转换为byte[]的代码,然后将数据传输给下位机,就大功告成了!

  兴奋时间还没有超过十秒钟,我就意识到自己从开始就绕了一个大圈:将数据传输给下位机并令下位机处理的,是指什么数据?仔细思考,有两种可能:

1、是列表中的坐标点,这样才能将处理之后的数据返回并再次显示,并非图片。

2、确实是图片,但即使是图片也不可能将转换之后的byte[]整个处理,因为这之间必然包含各种信息,如果不了解这些信息,如何告知下位机处理哪些数据,保留哪些数据?换句话说,也就是包含传输中数据格式的问题。

  总之,无论如何,距离最后的结果还有距离。

Anyway 先将这段代码附上:

  1. public partial class Form1 : Form
  2. {
  3. //private bool flag;
  4. public Form1()
  5. {
  6. InitializeComponent();
  7. }
  8.  
  9. /*private void Form1_Paint(object sender, PaintEventArgs e)
  10. {
  11. if (flag)
  12. {
  13. CreateGraph(zedGraphControl1);
  14. SetSize();
  15. flag = false;
  16. }
  17. }
  18. * */
  19. private void button1_Click(object sender, EventArgs e)
  20. {
  21. //flag = true;
  22. SetSize();
  23. CreateGraph(zedGraphControl1);
  24. }
  25.  
  26. private void CreateGraph(ZedGraphControl zgc)
  27. {
  28. GraphPane myPane = zgc.GraphPane;
  29. myPane.Clear();//消除上次痕迹
  30. myPane.Title.Text = "正弦函数";
  31. myPane.XAxis.Title.Text = "横坐标";
  32. myPane.YAxis.Title.Text = "竖坐标";
  33.  
  34. //获取用户设定的数据
  35. int T = Int32.Parse(numericUpDown1 .Text);//周期
  36. int A = Int32.Parse(numericUpDown2.Text);//幅度
  37. int B = Int32.Parse(numericUpDown3.Text);//初相
  38. double w=*Math.PI/T;
  39. double x, y1, y2;
  40. PointPairList list1 = new PointPairList();//定义坐标数组
  41. PointPairList list2 = new PointPairList();
  42. for (int i = ; i < ; i++)//逐一描点画图
  43. {
  44. x = (double)i ;//从坐标原点开始
  45. //y1 = 1.5 + Math.Sin((double)i * 0.2);
  46. y1 = A*Math.Sin((double)i * w+B);
  47. //y2 = 3.0 * (1.5 + Math.Sin((double)i * 0.2));
  48. y2 =3.0*(Math.Sin((double)i * 0.1*Math.PI));//作为研究的参考图形
  49. list1.Add(x, y1);
  50. list2.Add(x, y2);
  51. }
  52.  
  53. // Generate a red curve with diamond
  54. // symbols, and "Porsche" in the legend
  55. LineItem myCurve = myPane.AddCurve("Sin()",
  56. list1, Color.Red, SymbolType.Diamond);
  57.  
  58. // Generate a blue curve with circle
  59. // symbols, and "Piper" in the legend
  60. LineItem myCurve2 = myPane.AddCurve("参考",
  61. list2, Color.Blue, SymbolType.Circle);
  62.  
  63. // Tell ZedGraph to refigure the
  64. // axes since the data have changed
  65. zgc.AxisChange();
  66.  
  67. //发送WM_PAINT消息放在应用程序的消息队列中,WM_PAINT消息的优先级很低,所以不会立即重绘
  68. //zgc.Invalidate();//使窗口客户区无效,这样就需要重绘,
  69. zgc.Refresh();//刷新显示
  70.  
  71. }
  72.  
  73. private void Form1_Resize(object sender, EventArgs e)
  74. {
  75. //使控件大小随窗口大小改变而改变。是必要的
  76. SetSize();
  77. }
  78. private void SetSize()
  79. {
  80. zedGraphControl1.Location = new Point(, );//20
  81. zedGraphControl1.Size = new Size(ClientRectangle.Width-,ClientRectangle.Height-);//ClientRectangle.Width-22, ClientRectangle.Height-129);//20 20
  82. //MessageBox.Show(ClientRectangle.Height.ToString() + "h w" + ClientRectangle.Width.ToString());
  83. }
  84.  
  85. private void button2_Click(object sender, EventArgs e)//保存图片
  86. {
  87. zedGraphControl1.Refresh();//刷新图片
  88. pictureBox1.Image = zedGraphControl1.GetImage();//提取图片
  89. pictureBox1.Image.Save(@"D:\myImage00.bmp", ImageFormat.Bmp);//保存图片
  90. }
  91. }

  再接再励,继续。

  

  

C#做上位机软件——绘图并传输给下位机的更多相关文章

  1. "废物利用"也抄袭——“完全”DIY"绘图仪"<二、下位机程序设计>

    就不说怎么组装了吧,一把辛酸泪.说程序,因为这有两把辛酸泪……一把给下位机的C代码一把为了VB.NET的图像处理……不过就上上一篇说的,它们可以正确运行了,并且今天克服了Arduino上电过程中步进电 ...

  2. [自娱自乐] 4、超声波测距模块DIY笔记(四)——终结篇·基于C#上位机软件开发

    前言 上一节我们已经基本上把超声波硬件的发射和接收模块全部做好了,接下来我们着手开发一个软硬结合的基于C#的平面定位软件! 目录 一.整体思路 二.效果提前展示 2-1.软件部分展示 2-2.硬件部分 ...

  3. 【安富莱原创开源应用第1期】花式玩转网络摄像头之TCP上位机软件实现,高端大气上档次,速度2MB/S,华丽丽的界面效果

    说明:1.例子是两年前做的,一直没有顾上整理出来,今天特地整理出来,开源出来给大家玩.2.上位机是emWin模拟器开发的,大家估计很难猜到,所以你会emWin话的,就可以轻松制作上位机.做些通信和控制 ...

  4. C++ MFC实现基于RFID读写器的上位机软件

    C++ MFC实现基于RFID读写器的上位机软件 该博客涉及的完整工程托管在https://github.com/Wsine/UpperMonitor,觉得好请给个Star (/▽\=) 运行和测试环 ...

  5. 开源串口 Ymodem 上位机软件

    概述 上位机使用Qt开发,计划整合多个工具为一体,用作以后的调试工具. 当前完成功能: 1.串口调试 支持hex和ascii 码发送,接受. 支持自动添加回车换行. 支持定时发送,最短间隔100ms, ...

  6. 我编写的EEPROM 上位机软件

    进入模式: 上位机发送 消息 上位机EEPROM 按下进入模式 消息的ID号是:0x08111111 数据是: 00 01 ff 00 00 00 00 00 上位机显示 运行状态 :为进入模式 当我 ...

  7. 8-ESP8266 SDK开发基础入门篇--编写串口上位机软件

    https://www.cnblogs.com/yangfengwu/p/11087558.html 咱用这个编写 ,版本都无所谓哈,只要自己有就可以,不同版本怎么打开 https://www.cnb ...

  8. 手机刷机软件与ROM的盈利模式分析

    一. 智能手机的兴起不过短短几年时间,更新迭代已经让实体键盘成为回忆.智能手机带来的是人们生活习惯的改变,对于手机的重度依赖,是好是坏不去评价.智能手机相对于之前的手机最大的改变不仅仅是屏幕的飞速变大 ...

  9. C# WPF上位机实现和下位机TCP通讯

    下位机使用北京大华程控电源DH1766-1,上位机使用WPF.实现了电压电流实时采集,曲线显示.上午在公司调试成功,手头没有程控电源,使用TCP服务端模拟.昨天写的TCP服务端正好排上用场. 界面如下 ...

随机推荐

  1. git: 修改commiter 信息

    Committer: root root@localhost.localdomain 您的姓名和邮件地址基于登录名和主机名进行了自动设置.请检查它们正确 与否.您可以通过下面的命令对其进行明确地设置以 ...

  2. strchr()函数 和 strrchr() 函数

    strchr 定义于头文件 <string.h>char *strchr( const char *str, int ch );寻找ch(按照如同(char)ch的方式转换成char后)在 ...

  3. maven报brors occurred during the build

    原因分析: 此问题一般发生在eclipse保存文件并自动部署时候.本人在写项目的时候,还没等部署好,关闭了了eclipse,结果出现了这种情况.有一种产生此错误的原因是因为此项目不不是由eclipse ...

  4. 使用ab对nginx进行压力测试

    nginx以高并发,省内存著称. 相信大多数安装nginx的同学都想知道自己的nginx性能如何. 我想跟大家分享下我使用ab工具的压力测试方法和结果, ab是针对apache的性能测试工具,可以只安 ...

  5. vim格式化代码实际上就是 "缩进代码", 命令是等号=

    vim格式化代码实际上就是 "缩进代码", 命令是等号= 格式化就是 vim 根据 文件的类型, 自动的对代码进行 缩进 缩进的类型有多种, 都是用等号命令: = 全部格式化 : ...

  6. 关于MySQL的wait_timeout连接超时问题报错解决方案

    bug回顾 : 想必大家在用MySQL时都会遇到连接超时的问题,如下图所示: ### Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsExce ...

  7. Excel——使用OFFSET、MATCH、COUNTA实现二级菜单

    如图所示,接下来提供两种办法实现: 1.将A.B.C.D定义为名称NAME. 2.设置一级菜单单元格数据有效性为NAME. 3.设置二级菜单格数据有效为: =OFFSET($A$1,MATCH($A6 ...

  8. Azure上的那些IP

    相信第一次接触Azure的读者都会碰到这样一个问题,就是Azure的IP地址,笔者第一次接触Azure也是被搞懵逼了,一会儿VIP,不知道的还以为是会员的意思呢,一会儿又是DIP,后来又来了个PIP, ...

  9. calendar的一些操作

    一.通过分析日期函数,根据日期进行一系列操作,例如:我们需要知道2个时间段中所有的日期等等. 由于Calendar 类是一个抽象类,因此我们不能通过new来获取该对象的实例.我们可以通过其类方法 ge ...

  10. ubuntu专用

    独立显卡处理驱动处理问题: http://blog.csdn.net/liufunan/article/details/52090382 git的教程: http://www.bootcss.com/ ...