g#+中的外部异常#

时间:2009-05-16 11:08:06

标签: c# image exception gdi+ bitmap

我想运行这段代码

        Bitmap grayImage = (Bitmap)img.Clone();

        for (int x = 0; x < arr.GetLength(0); x++)
        {
            for (int y = 0; y < arr.GetLength(1); y++)
            {
                int col = arr[x, y];
                Color grau = Color.FromArgb(col, col, col);
                grayImage.SetPixel(x, y, grau);
            }
        }

如果我运行代码,我会在此行中获得异常:grayImage.SetPixel(x,y,grau);

以下是例外详情:

System.Runtime.InteropServices.ExternalException wurde nicht behandelt。   Message =“GDI +中发生了一般错误。”   来源= “System.Drawing中”   错误码= -2147467259   堆栈跟踪:        在System.Drawing.Bitmap.SetPixel(Int32 x,Int32 y,Color color)        在D:\ Documents \ Visual Studio 2008 \ Projects \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Bild.cs中的Metalldetektor.Bild.ArrToPic(Int32 [,] arr,Image img):第44行        at Metalldetektor.Form1.button2_Click(Object sender,EventArgs e)在D:\ Documents \ Visual Studio 2008 \ Projects \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Form1.cs:第58行        在System.Windows.Forms.Control.OnClick(EventArgs e)        在System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)        在System.Windows.Forms.Control.WmMouseUp(消息&amp; m,MouseButtons按钮,Int32点击)        在System.Windows.Forms.Control.WndProc(消息&amp; m)        在System.Windows.Forms.ButtonBase.WndProc(消息&amp; m)        在System.Windows.Forms.Button.WndProc(消息&amp; m)        在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp; m)        在System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)        在System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&amp; msg)        在System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID,Int32 reason,Int32 pvLoopData)        在System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason,ApplicationContext context)        在System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason,ApplicationContext context)        在D:\ Documents \ Visual Studio 2008 \ Projects \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Program.cs中的Metalldetektor.Program.Main():第19行        在System.AppDomain._nExecuteAssembly(Assembly assembly,String [] args)        在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()        在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)        在System.Threading.ThreadHelper.ThreadStart()   InnerException:

我不知道该怎么做,请帮忙!

4 个答案:

答案 0 :(得分:2)

我过去遇到过类似的问题,我的克隆位图有一些文物。在研究了这个问题一段时间之后,我偶然发现this thread帮了解。

尝试更换克隆()

Bitmap grayImage = (Bitmap)img.Clone();

用这个:

Bitmap grayImage = new Bitmap(img);

答案 1 :(得分:0)

我不知道这个错误,但这可能是LockBits的情况......我会看看我是否可以举一个例子。

这是一个将数据数组写入ARGB位图的简化示例:

    // fake data
    int[,] data = new int[100, 150];
    int width = data.GetLength(0), height= data.GetLength(1);
    for (int x = 0; x < width; x++)
        for (int y = 0; y < height; y++)
            data[x, y] = x + y;

    // process it into a Bitmap
    Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
    BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height),
       ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
    unsafe {
        byte* root = (byte*)bd.Scan0;
        for (int y = 0; y < height; y++) {
            byte* pixel = root;
            for (int x = 0; x < width; x++) {
                byte col = (byte)data[x, y];
                pixel[0] = col;
                pixel[1] = col;
                pixel[2] = col;
                pixel[3] = 255;
                pixel += 4;
            }
            root += bd.Stride;
        }
    }
    bmp.UnlockBits(bd);
    bmp.Save("foo.bmp"); // or show on screen, etc

这种方法应该比SetPixel批次

答案 2 :(得分:0)

很久以前,在我的一个队友系统上处理图像(通过从SQL服务器读取二进制数据创建图像)时出现了一些错误。相同的代码在其他机器上运行良好。事实证明,他已经为图形驱动程序安装了一些更新,这导致了问题。

答案 3 :(得分:0)

如果您只是覆盖所有图像(或左上角的矩形),为什么要克隆另一个图像?