Code Bye

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

 

第一次在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有东西了,可以保存了了,但似乎很卡,最小化,最大化时,即产生重绘事件时,
我主界面上的工具栏也重绘不了啦,
像如图所示

正常的:

异常的:

在线等啊,

其实我的问题很简单,求是在paint事件里用Graphics绘图后picturebox里的image对象为何还为空,没有反应到里面去?
如果在paint事件里把image对象赋值为新创建的Bitmap对象后又很卡,

4分
你绘图管绘图,Bitmap bmp也照样绘制,相当于同时绘制两张图,最后pictureBox1.Image别去绑bmp,保存用bmp.save
也就是pictureBox中现有显示的图形如何复制到另一个pictrueBox中呢?
因为我所有图形都是动态在paint事件中绘制的,
引用 2 楼 xdashewan 的回复:

你绘图管绘图,Bitmap bmp也照样绘制,相当于同时绘制两张图,最后pictureBox1.Image别去绑bmp,保存用bmp.save

嗯,这样应该可以,

pictureBox中现有显示的图形如何复制到另一个pictrueBox中呢?
 因为我所有图形都是动态在paint事件中绘制的, 

其实我的最终目的是想让我绘制的图形中一部分反色显示,就是标记出用户所选择的那一块图形,
现在是将选中的那一块加一个边框,但我想反色处理,
所以必须要获取那一块图形的颜色点,即image或者bitmap对象都可以,

20分
引用 3 楼 i7494 的回复:

也就是pictureBox中现有显示的图形如何复制到另一个pictrueBox中呢?
因为我所有图形都是动态在paint事件中绘制的,

这取决于你另一个pictrueBox如何画,如果是和第一个同步画,那么处理方法和你这个一样,如果是事后才复制,那么就用那个bmp对象绑Image

paint事件{
e.Graphics.draw___
///若干条绘图指令

//获取上边绘图的整个图形,将其中一矩形区域图形反色显示,用户选择区域
}

其实就是想获取即image或者bitmap对象都可以

引用 5 楼 xdashewan 的回复:
Quote: 引用 3 楼 i7494 的回复:

也就是pictureBox中现有显示的图形如何复制到另一个pictrueBox中呢?
因为我所有图形都是动态在paint事件中绘制的,

这取决于你另一个pictrueBox如何画,如果是和第一个同步画,那么处理方法和你这个一样,如果是事后才复制,那么就用那个bmp对象绑Image

见我6楼

paint事件{
e.Graphics.draw___
 ///若干条绘图指令

//获取上边绘图的整个图形,将其中一矩形区域图形反色显示,用户选择区域
}

其实就是想获取即image或者bitmap对象都可以 

谢谢您的回复

1分
Graphics g2 = Graphics.FromImage(bmp);Graphics又不是规定只能有1个,你两个同时用不就即画了picturebox又有了一个bmp副本了嘛,有了副本什么时候用都行了
30分
既然绘的图内容要保存,那可以在内容有变化的时候绘到一个Image上,然后在Picturebox上显示就可以了.
pictureBox1_Paint 这个方法楼主不需要用,它只是在窗体显示图像的时候可以做些添油加醋的事情.

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明第一次,在pictureBox1_Paint事件中用Graphics绘图后,如何保存pictureBox1中的图像?