第一次,在pictureBox1_Paint事件中用Graphics绘图后,如何保存pictureBox1中的图像?

下雨天2 2015-05-04 10:39:35
第一次在CSDN发贴,以前只是看贴不回贴
还请大家指点一二


,在pictureBox1_Paint事件中用Graphics绘图后
,如何保存pictureBox1中的图像?


在pictureBox1_Paint事件中绘制完毕后
pictureBox1.Image依然=null

e.Graphics.DrawLine绘制的图像没有反应到image中去么?

pictureBox1_Paint事件过后
我在另一个按钮里调用 ,
pictureBox1.Image.Save("c:\\a.bmp");
则失败,此时image=null



我也试过这样弄,
            Bitmap bmp=new Bitmap(200,500);
Graphics g = Graphics.FromImage(bmp); ;// e.Graphics;
//横网格
Pen backpen = new Pen(Color.FromArgb(cIDE_INFO.colorBack.ToArgb()-0x00404040)); //背景色变暗40
backpen.DashStyle = DashStyle.Custom; //.DashDotDot;
backpen.DashPattern = new float[] { 1, 6 };
for (float i = cIDE_INFO.ideCodeSize.Height / 2; i < pictureBox1.Height; i += cIDE_INFO.ideCodeSize.Height)
{
g.DrawLine(backpen, 0, i, pictureBox1.Width, i);
}
//竖网格
for (float i = cIDE_INFO.ideCodeSize.Width / 2; i < cIDE_INFO.ideCodeVnum * cIDE_INFO.ideCodeSize.Width; i += cIDE_INFO.ideCodeSize.Width)
{
g.DrawLine(backpen, i, 0, i, pictureBox1.Height);
}
//画指令
//todo:要翻页
Point tp=new Point();
foreach (ArrayList tzls in ide_all_zls)
{
tp.X = 0;
foreach (object tzl in tzls)
{
cIDE_INFO.ideDrawMove(tp, g);
if (tzl != null)
{
if (tzl.GetType() == typeof(ide.code_type))
{
cIDE_INFO.DrawZL((ide.code_type)tzl, g);
if (((ide.code_type)tzl).分支 == true)
{
cIDE_INFO.ideDrawMove(tp, g);
cIDE_INFO.DrawV(g);
}
}
else if (tzl.GetType() == typeof(string))
{
string tstr = (string)tzl;
if (tstr.IndexOf("H") >= 0)
{
cIDE_INFO.DrawH(g);
}
}
}
tp.X++;
}
tp.Y++;
}
//画当前插入点 反色处理
g.ResetTransform();

pictureBox1.Image = bmp;


这样pictureBox1.Image有东西了,可以保存了了,但似乎很卡,最小化,最大化时,即产生重绘事件时,
我主界面上的工具栏也重绘不了啦,
像如图所示

正常的:

异常的:
...全文
516 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcmakebest 2015-05-04
  • 打赏
  • 举报
回复
既然绘的图内容要保存,那可以在内容有变化的时候绘到一个Image上,然后在Picturebox上显示就可以了. pictureBox1_Paint 这个方法楼主不需要用,它只是在窗体显示图像的时候可以做些添油加醋的事情.
xdashewan 2015-05-04
  • 打赏
  • 举报
回复
Graphics g2 = Graphics.FromImage(bmp);Graphics又不是规定只能有1个,你两个同时用不就即画了picturebox又有了一个bmp副本了嘛,有了副本什么时候用都行了
下雨天2 2015-05-04
  • 打赏
  • 举报
回复
引用 5 楼 xdashewan 的回复:
[quote=引用 3 楼 i7494 的回复:] 也就是pictureBox中现有显示的图形如何复制到另一个pictrueBox中呢? 因为我所有图形都是动态在paint事件中绘制的,
这取决于你另一个pictrueBox如何画,如果是和第一个同步画,那么处理方法和你这个一样,如果是事后才复制,那么就用那个bmp对象绑Image[/quote] 见我6楼 paint事件{ e.Graphics.draw___ ///若干条绘图指令 //获取上边绘图的整个图形,将其中一矩形区域图形反色显示,用户选择区域 } 其实就是想获取即image或者bitmap对象都可以 谢谢您的回复
下雨天2 2015-05-04
  • 打赏
  • 举报
回复
paint事件{ e.Graphics.draw___ ///若干条绘图指令 //获取上边绘图的整个图形,将其中一矩形区域图形反色显示,用户选择区域 } 其实就是想获取即image或者bitmap对象都可以
xdashewan 2015-05-04
  • 打赏
  • 举报
回复
引用 3 楼 i7494 的回复:
也就是pictureBox中现有显示的图形如何复制到另一个pictrueBox中呢? 因为我所有图形都是动态在paint事件中绘制的,
这取决于你另一个pictrueBox如何画,如果是和第一个同步画,那么处理方法和你这个一样,如果是事后才复制,那么就用那个bmp对象绑Image
下雨天2 2015-05-04
  • 打赏
  • 举报
回复
引用 2 楼 xdashewan 的回复:
你绘图管绘图,Bitmap bmp也照样绘制,相当于同时绘制两张图,最后pictureBox1.Image别去绑bmp,保存用bmp.save
嗯,这样应该可以, pictureBox中现有显示的图形如何复制到另一个pictrueBox中呢? 因为我所有图形都是动态在paint事件中绘制的, 其实我的最终目的是想让我绘制的图形中一部分反色显示,就是标记出用户所选择的那一块图形, 现在是将选中的那一块加一个边框,但我想反色处理, 所以必须要获取那一块图形的颜色点,即image或者bitmap对象都可以,
下雨天2 2015-05-04
  • 打赏
  • 举报
回复
也就是pictureBox中现有显示的图形如何复制到另一个pictrueBox中呢? 因为我所有图形都是动态在paint事件中绘制的,
xdashewan 2015-05-04
  • 打赏
  • 举报
回复
你绘图管绘图,Bitmap bmp也照样绘制,相当于同时绘制两张图,最后pictureBox1.Image别去绑bmp,保存用bmp.save
下雨天2 2015-05-04
  • 打赏
  • 举报
回复
在线等啊, 其实我的问题很简单,求是在paint事件里用Graphics绘图后picturebox里的image对象为何还为空,没有反应到里面去? 如果在paint事件里把image对象赋值为新创建的Bitmap对象后又很卡,

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧