2014-03-12 7 views
1

В настоящее время я пишу программу, которая создает цвета и выводит их в pictureBox. Я делаю это в цикле 3D-for, чтобы создать все цвета RGB. Все это происходит в фоновом режиме. Мой код выглядит следующим образом:ArgumentException при создании растровых изображений

private void ColorWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Color color; 
    String hex; 
    Bitmap image; 

    Invoke((MethodInvoker)delegate 
    { 
    progressBar1.Maximum = (255 * 255 * 255); 
    progressBar1.Value = 0; 
    }); 

    for (int r = 0; r <= 255; r++) 
    { 
    for (int g = 0; g <= 255; g++) 
    { 
     for (int b = 0; b <= 255; b++) 
     { 
     hex = "#FF" + r.ToString("X2") + g.ToString("X2") + b.ToString("X2"); 
     color = System.Drawing.ColorTranslator.FromHtml(hex); 
     image = new Bitmap((int)nudWidth.Value, (int)nudHeight.Value); 

     using (Graphics gfx = Graphics.FromImage(image)) 
     using (SolidBrush brush = new SolidBrush(color)) 
     { 
      gfx.FillRectangle(brush, 0, 0, image.Width, image.Height); 
     }    

     Invoke((MethodInvoker)delegate 
     { 
      pictureBox1.Image = image; 
      progressBar1.Value++; 
      label13.Text = progressBar1.Value + "/" + progressBar1.Maximum; 
     }); 
     } 
    } 
    } 
} 

Я создаю растровые изображения размером 1920x1080. Но после примерно 220 созданных изображений я получаю An exception of type 'System.ArgumentException' occurred in System.Drawing.dll. Это также происходит при использовании меньших размеров, но тогда требуется больше времени, чтобы прекратить работу. Есть ли ошибка в моем коде?

Stack Trace

InnerException является NULL

An exception of type 'System.ArgumentException' occurred in System.Drawing.dll but was not handled in user code 

Additional information: Invalid Parameter. 

If there is a handler for this exception, the program may be safely continued. 
+0

Возможно ли, чтобы вы опубликовали полное исключение, включая сообщение, внутренние исключения и стекы? И, пожалуйста, укажите, на какой строке кода вашего примера возникает исключение. –

+0

добавил немного вещей, надеюсь, что это достаточно –

ответ

3

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

Очищайте растровые изображения каждый раз - в противном случае они просачиваются чем-то свирепым.

Bitmap previousImage = null; 
for(r... g... b...) 
{ 
    // ... 

    Invoke((MethodInvoker) delegate 
    { 
      var previousImage = pictureBox1.Image; 
     pictureBox1.Image = image; 
     if (previousImage != null) 
      previousImage.Dispose(); 
    }); 
} 
+0

Это сделало трюк, большое спасибо –

Смежные вопросы