2013-05-03 99 views
2

请考虑运行在Windows服务中的以下代码。在图形对象上绘制图像时gdi +一般错误

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张图像后始终发生。

谷歌搜索后,似乎这是一个常见的问题,当保存文件,但这里的区别是,没有文件被保存。一个图像绘制在一个Graphics对象上。

有谁知道如何解决这一问题?

+0

我们无法看到带有错误的代码,它位于创建位图之前被推入队列的代码中。有很好的可能性,因为你小心使用*使用*,可能会做一些处理内存流。它在图像存储器管理器需要浸入本地像素数据以渲染图像时发生爆炸。 – 2013-05-03 10:10:01

+0

resourceQueue是一个字符串队列,用于保存图像路径,但不保存图像。 thumbImage可以在绘制Graphics对象之后安全处理吗? – Laurijssen 2013-05-03 10:20:04

+0

我没有猜到包含字符串的队列。不知道为什么13是一个不幸的数字。是星期五。 – 2013-05-03 10:36:05

回答

0

最有可能用于创建位图的流(如果是这样的话)被关闭。他们必须保持开放的位图的生活。您可以将该流复制到新的MemoryStream中,然后关闭原件。