c # Внешнее исключение в GDI + - PullRequest
3 голосов
/ 16 мая 2009

Я хочу запустить этот кусок кода

        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. Сообщение = "Произошла общая ошибка в GDI +." Источник = "System.Drawing" ErrorCode = -2147467259 Трассировки стека: в System.Drawing.Bitmap.SetPixel (Int32 x, Int32 y, Цветовой цвет) в Metalldetektor.Bild.ArrToPic (Int32 [,] arr, Image img) в D: \ Documents \ Visual Studio 2008 \ Projects \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Bild.cs: строка 44 в Metalldetektor.Form1.button2_Click (Отправитель объекта, 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 (сообщение & m, кнопка MouseButtons, щелчки Int32) в System.Windows.Forms.Control.WndProc (сообщение & m) в System.Windows.Forms.ButtonBase.WndProc (сообщение & m) в System.Windows.Forms.Button.WndProc (сообщение & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Message & m) в System.Windows.Forms.NativeWindow.DebuggableCallback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW (MSG & msg) в System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (Int32 dwComponentID, причина Int32, Int32 pvLoopData) в System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (причина Int32, контекст ApplicationContext) в System.Windows.Forms.Application.ThreadContext.RunMessageLoop (причина Int32, контекст ApplicationContext) в Metalldetektor.Program.Main () в D: \ Documents \ Visual Studio 2008 \ Projects \ WindowsFormsApplication1 \ WindowsFormsApplication1 \ Program.cs: строка 19 в System.AppDomain._nExecuteAssembly (сборка сборки, аргументы String []) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ThreadHelper.ThreadStart () InnerException:

Я не знаю, что делать, пожалуйста, помогите!

Ответы [ 4 ]

2 голосов
/ 16 мая 2009

В прошлом у меня была похожая проблема, когда у моего клонированного растрового изображения были некоторые артефакты. После изучения этой проблемы я наткнулся на эту ветку , которая помогла.

Попробуйте заменить свой клон ()

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

с этим:

Bitmap grayImage = new Bitmap(img);
0 голосов
/ 16 мая 2009

Давным-давно была некоторая ошибка при обработке изображения (создание изображения путем чтения двоичных данных с сервера SQL) на одной из систем моего партнера по команде. Тот же код отлично работал на других машинах. Оказалось, что он установил некоторое обновление для графического драйвера, и это вызвало проблемы.

0 голосов
/ 16 мая 2009

Почему вы клонируете другое изображение, если просто перезаписываете все (или левый верхний прямоугольник)?

0 голосов
/ 16 мая 2009

Я не знаю об ошибке, но это может быть в случае 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...