收录日期:2020/05/27 17:46:23 时间:2016/07/19 11:33:52 标签:C#
zl194 于 2009-12-28 15:36:19 编辑 下面的代码是我写的一个类似于股票图的代码,大意是在一个底稿上画2条曲线,一个标准值,一个检测值,并画出x和y的坐标轴刻度和图例。

方法可以正常运行,也能得到图像,在win2003的机器上,总是在程序运行很久以后(如这个方法运行结束了几分钟后)提示GDI+错误,在Winxp上就很少有提示,至少我测试的机器上没出过。

  public static Bitmap writeImage(Bitmap image,double[] dubleY1, double[] DubleY2, int[] xLine1,int[] xLine2, double yStart, double yUnit, int xUnit, string yName,int tt,int xStart)
        {
            Pen p1 = Pens.Blue;   //写图例的画笔
            Pen p2 = Pens.Red;
            Brush bs1 = Brushes.Blue;  //画线用的
            Brush bs2 = Brushes.Red;
            int[] y1 = getYpoint1(dubleY1, yStart, yUnit);  //Y轴的坐标点
            int[] y2 = getYpoint1(DubleY2, yStart, yUnit);  //Y轴的坐标点
            
            //Bitmap image = Resource2.KT3;//线图底稿  

            Bitmap newimage = new Bitmap(image.Width, image.Height);
            Graphics oGraphic = Graphics.FromImage(newimage);
            Point p00 = new Point(0, 0);
            oGraphic.DrawImage(image, p00);
            image.Dispose();
            image = newimage;


            Point[] py1 = new Point[y1.Length];
            Point[] py2 = new Point[y2.Length];
            
            ……这里有一段得到Y 点数组的代码,取得每个Y点的位置

            using (Graphics g = Graphics.FromImage(image))  //在背景图上画 折线图
            {
                if (py1.Length > 1)
                {
                    g.DrawLines(p1, py1);//标准值 曲线
                }
                if (py2.Length > 1)
                {
                    g.DrawLines(p2, py2);//检测值    曲线
                }
                
                //画y轴坐标
                for (int i = 0; i <7; i++)
                {
                    double iYvalue = yStart + yUnit * 20 * i;
                    g.DrawString(iYvalue.ToString("0.00"), ft, bs2, theYs[i]);
                    
                }
                //画x轴坐标
                for (int i = 0; i <5; i++)
                {
                    string xValue = "0";

                    int theXvalue = (i * xUnit + 1) * 50;
                    xValue = Convert.ToInt32(i * 5 * xUnit+xStart).ToString();


                    g.DrawString(xValue, ft, Brushes.White, theXs[i]);
                }
                //画出图例
                int leng = yName.Length;
                Point pA;
                Point pB;
                        switch (tt)
                        {
                            case 0:
                                pA = new Point(700, 20);
                                pB = new Point(700, 35);
                            ^                            default:
                                pA = new Point(1820, 1160);
                                pB = new Point(1820, 1175);
                                break;
                        }
               
                g.DrawString("[" + yName + ":标准值]", ft2, bs1, pA);
                g.DrawString("[" + yName + ":检测值]", ft2, bs2, pB);


            }
            return image;


        }


谁能帮我分析分析是怎么回事呢,或者这种不是实时出现的错误怎么测试呢。
没看出有什么问题,等待高手吧。帮顶
没弄过!纯粹是来顶楼住的
 image.Dispose();
 image = newimage;
顺序反一下呢..

  switch (tt)
                        {
                            case 0:
                                pA = new Point(700, 20);
                                pB = new Point(700, 35);
                            ^                            default:
               //这里多了个 ^
                                pA = new Point(1820, 1160);
                                pB = new Point(1820, 1175);
                                break;
                        }

究竟提示什么?
Bitmap newimage = new Bitmap(image.Width, image.Height);
            Graphics oGraphic = Graphics.FromImage(newimage);
            Point p00 = new Point(0, 0);
            oGraphic.DrawImage(image, p00);
            image.Dispose();
            image = newimage;

看上去这段是多余的  你新建个BMP 不如直接在原来上直接画了
study
帮顶
问题是什么。 请详细、
#6 说得对...
帮顶~
如果是GDI+一般性错误,那就是图片文件只读或者文件已经被打开.
你可以使用日志文件,把出异常的堆栈记下

这样容易确定异常位置。
等我去超一下,错误原文。
错误是:
对话框标题:Microsoft .NET Framework
内容:
Unhandled exception has occured in your application If
you click Continue,the application will ignore this
error and attemp to contion.If you click Quit,
the application will close immediately

A generic error occurred in GDI+

详细:
See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.
   at System.Drawing.Graphics.Clear(Color color)
   at System.Windows.Forms.ToolStripSystemRenderer.RenderStatusStripBackground(ToolStripRenderEventArgs e)
   at System.Windows.Forms.ToolStripSystemRenderer.OnRenderToolStripBackground(ToolStripRenderEventArgs e)
   at System.Windows.Forms.ToolStripRenderer.DrawToolStripBackground(ToolStripRenderEventArgs e)
   at System.Windows.Forms.ToolStrip.OnPaintBackground(PaintEventArgs e)
   at System.Windows.Forms.StatusStrip.OnPaintBackground(PaintEventArgs e)
   at System.Windows.Forms.Control.PaintTransparentBackground(PaintEventArgs e, Rectangle rectangle, Region transparentRegion)
   at System.Windows.Forms.Control.PaintTransparentBackground(PaintEventArgs e, Rectangle rectangle)
   at System.Windows.Forms.Control.PaintBackground(PaintEventArgs e, Rectangle rectangle, Color backColor, Point scrollOffset)
   at System.Windows.Forms.Control.PaintBackground(PaintEventArgs e, Rectangle rectangle)
   at System.Windows.Forms.Control.OnPaintBackground(PaintEventArgs pevent)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
   at System.Windows.Forms.Control.WmPaint(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.StatusStrip.RightToLeftLayoutGrip.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
dmProduction
    Assembly Version: 1.0.0.2
    Win32 Version: 1.0.0.2
    CodeBase: file:///D:/Program%20Files/XXXX系统/dmProduction.exe
----------------------------------------
System.Windows.Forms
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
ClassMyDate
    Assembly Version: 1.0.0.4
    Win32 Version: 1.0.0.4
    CodeBase: file:///D:/Program%20Files/XXXX系统/ClassMyDate.DLL
----------------------------------------
System.Data
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
System.Configuration
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Transactions
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.Transactions/2.0.0.0__b77a5c561934e089/System.Transactions.dll
----------------------------------------
System.EnterpriseServices
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.EnterpriseServices/2.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll
----------------------------------------
cplan
    Assembly Version: 1.0.0.0
    Win32 Version: 1.0.0.0
    CodeBase: file:///D:/Program%20Files/XXXX系统/cplan.DLL
----------------------------------------
taskprocess
    Assembly Version: 1.0.0.3
    Win32 Version: 1.0.0.3
    CodeBase: file:///D:/Program%20Files/XXX系统/taskprocess.DLL
----------------------------------------
zgraph
    Assembly Version: 1.0.0.1
    Win32 Version: 1.0.0.1
    CodeBase: file:///D:/Program%20Files/XXXX系统/zgraph.DLL
----------------------------------------

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.


等待中
定下
GDI+ 的一般性错误.  你去查查资料就知道了..
会不会跟垃圾回收有关
因为server和workstation的机制不一样
gdi+ 后生来看哈。。。帮顶。。。
没有server的OS
不好测
使用了相同的文件名称,或者上次的对象没有Dispose掉  
解决A generic error occurred in GDI+
引用 22 楼 wuyq11 的回复:
使用了相同的文件名称,或者上次的对象没有Dispose掉 
解决A generic error occurred in GDI+


帮顶
还是不行啊。有没有什么方法能测试出到底是什么位置出的错误。每次错误都是在没有任何操作的情况下弹出的。
把image.Dispose();
  image = newimage;
去掉,然后后面的image的地方都改用newimage试试

不太明白为什么要dispose掉image,然后把newimage赋给image再对image操作。。。
Bitmap newimage = new Bitmap(image.Width, image.Height);
Graphics oGraphic = Graphics.FromImage(newimage);
Point p00 = new Point(0, 0);
oGraphic.DrawImage(image, p00);
image.Dispose();
image = newimage;

这段代码的逻辑混乱,究竟是要干什么?
你可以用一个 Rectangle
再用Graphics.DrawPie
要是愿意代码发给我
我给你调!
引用 25 楼 lorenliu 的回复:
把image.Dispose();
  image = newimage;
去掉,然后后面的image的地方都改用newimage试试

不太明白为什么要dispose掉image,然后把newimage赋给image再对image操作。。。


这段我也检查有问题,现在把 image=newimage;去掉了,直接使用newimage,最后返回newimage.
但还是有同样的错误。我现在开始感觉是win2003的问题了。愁!!
引用 26 楼 yuxuanji 的回复:
Bitmap newimage = new Bitmap(image.Width, image.Height);
Graphics oGraphic = Graphics.FromImage(newimage);
Point p00 = new Point(0, 0);
oGraphic.DrawImage(image, p00);
image.Dispose();


这段代码的逻辑混乱,究竟是要干什么?
你可以用一个 Rectangle
再用Graphics.DrawPie


这段是有些问题,原想是释放掉image,在新的图像里操作,避免原图像的锁定。现在改了,将image = newimage;去掉了,后面的引用全部使用newimage,并返回newimage.但还是不行。
引用 27 楼 qiqundelang 的回复:
要是愿意代码发给我
我给你调!


谢谢!光给你一个图像类行吗,别的部分我不能做主,如过你有win2003的环境就帮我测测。
可以!
huipengzheng@sina.com
帮顶
这个 image 对象返回后有保存操作吗?

诚心跪求一个名字,谢谢了,急~~~ xml转化谢谢 执行ant命令时提示build.xml does not exist! xml转化谢谢 请教有关字符串搜索的问题 【丑闻丑闻】如果是真的,那可真让我恶心。以后要少来。 (强结我帖子的朋友你好吗?) datagrid如何统计某列的总和并把数据写在最后一行? 【询问】【请在线斑竹进来】现在可以发政治贴了吗? 如何在ASP中管理SQL的数据库! 求分布式数据库的源码 一个小问题,大家都来看看,我只能出这么多钱了,希望帮帮忙! 构造器的修饰符可以是哪些?缺省是哪个? 求救﹐我想在我的DATAGRID的頁腳中加入LABEL控件﹐用來顯示當前頁及總頁數﹐請問怎么才能加入這控件呢﹗在線等﹗﹗﹗﹗﹗﹗﹗﹗﹗ 关于Log Shipping的一个问题,并祝福大力和璇玑幸福美满! SQL语句用法 【公告】扩充话题灌水乐园,程序人生版主职务进行变更!特此公告! 高中数学 高分求助:OA系统公文流转中的文件权限问题,请高手指点! 从硬盘读取wav文件然后保存在变量中可以实现吗? 提示:update语句的语法错误,用的是ACCESS,在线等,解决马上给分。 如果我知道SQLSERVER2000的SA密码,有办法改掉WINDOWS2000的Administrator密码吗? 关于工作流节点问题 JBuilder 下 debug SOAP 服务器端程序的问题 关于ado控件的问题! 网设一年考几次啊?什么时候报名? 一个事件,需要完成两件事情,谁能帮忙?比较着急啊! 如何把Word文件转成一系列图片(要求打印时不能丢失信息)zara 和icansaymyabc请进来 【公告】Ginger就是21鸟的证据!最后100分也不要了,21鸟(ginger)你要封就封了我吧!!!!!!! 帮个忙,快受不了 关于AutoCAD二次开发中形文件的问题