2013-05-03 3 views
2

Рассмотрите следующий код, запущенный в службе Windows.gdi + общая ошибка при рисовании изображения на объекте Graphics

Graphics g = Graphics.FromImage(printImage); 

for (int rows = 1; rows <= thumbRows; rows++) { 
    for (int cols = 1; cols <= thumbColumns; cols++) { 
     using (Image thumbImage = new Bitmap(resourceQueue.Peek())) 
     { 
      g.DrawImage(thumbImage, targetRect, sourceRect, GraphicsUnit.Pixel); 

      resourceQueue.Dequeue(); 
      if (resourceQueue.Count == 0) break; 
     } 
    } 
} 

Код рисует список изображений после их уменьшения на другое изображение. Он отлично работает в большинстве случаев, но иногда исключение выбрасывается в середине цикла на изображении thumbImage = new Bitmap. Исключением является «Общая ошибка, произошедшая в GDI +». Это всегда происходит после создания 13-го изображения независимо от того, какие изображения используются.

После поиска в Google кажется, что это общая проблема при сохранении файлов, но разница в том, что файл не сохраняется. Изображение нарисовано на объекте Graphics.

Кто-нибудь знает, как это исправить?

+0

Мы не можем видеть код с ошибкой, он находится в коде, который создал растровое изображение, прежде чем он попал в очередь. С хорошими шансами, что, поскольку вы осторожны с использованием * using *, возможно, что-то вроде удаления потока памяти. Он бомбит, когда менеджер памяти изображений должен окунаться в исходные данные пикселя для рендеринга изображения. –

+0

resourceQueue - это очередь строк, содержащих пути к изображениям, на которых она не хранит изображения. thumbImage можно безопасно удалять после правильного рисования объекта Graphics? – Laurijssen

+0

Я не догадывался в этой очереди, содержащей строки. Не знаю, почему 13 - неудачное число. Сегодня пятница. –

ответ

0

Скорее всего, поток, используемый для создания растрового изображения (если это то, что он есть), закрыт. Они должны оставаться открытыми для жизни растрового изображения. Вы можете скопировать поток в новый MemoryStream, а затем закрыть оригинал.

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