2014-02-07 57 views
0

我正在加載與特定文件名掩碼匹配的文件夾中的所有圖像(*.tif)。一次一個,我拉出一部分圖像,並將其放入輸出圖像中,並在其旁邊標記它來自哪個文件。當我保存輸出圖像時,我有時會得到一個通用的GDI +錯誤。生成圖像時的通用GDI +?

Rectangle source = new Rectangle(0, 0, 2500, 50); 
Font font = new Font("Arial", 12); 
String filename = new DirectoryInfo(dir).Name; 
Rectangle divider = new Rectangle(0, 50, 2900, 5); 
Brush lightgray = new SolidBrush(Color.FromArgb(235, 235, 235)); 

Console.WriteLine("Looking in \"" + dir + "\" for \"" + mask + "\""); 

List<string> files = Directory.EnumerateFiles(dir, mask).ToList(); 
using (Bitmap output = new Bitmap(2900, (source.Height + divider.Height) * (files.Count + 1))) 
{ 
    using (Graphics g = Graphics.FromImage(output)) 
    { 
     g.FillRectangle(Brushes.White, 0, 0, output.Width, output.Height); 
     Rectangle target = new Rectangle(new Point(), source.Size); 
     foreach (string file in files) 
     { 
      try 
      { 
       using (Bitmap cur = (Bitmap)Bitmap.FromFile(file)) 
       { 
        g.DrawImage(cur, target, source, GraphicsUnit.Pixel); 
       } 
      } 
      catch 
      { 
       Point p1 = target.Location; 
       p1.Offset(3, 3); 
       g.DrawString("Not an Image File", font, Brushes.Black, p1); 
      } 
      finally 
      { 
       string name = Path.GetFileName(file); 
       g.DrawString(name, font, Brushes.Black, target.X + target.Width, target.Y + 4); 
       g.FillRectangle(lightgray, divider); 
       divider.Y += source.Height + divider.Height; 
       target.Y += source.Height + divider.Height; 
      } 
     } 
     Point p2 = target.Location; 
     p2.Offset(3, 3); 
     String type = "images"; 
     if (mask == "*") type = "files"; 
     if (files.Count == 1) type = type.Substring(0, type.Length - 1); 
     g.DrawString("Processed " + files.Count + " " + type, font, Brushes.Black, p2); 
    } 
    output.Save(filename + ".png", ImageFormat.Png);// GDI+ Error here 
} 

我不得不搜索特定圖像的數千張大圖像。在這些圖像的每一個的頂部都有一個生成的區域,我希望此程序能夠積累,因此我可以輕鬆地在一個位置瀏覽所有文件的該區域。如果我將應用程序指向一個文件夾,它可以工作,但是如果我將它指向另一個文件夾,它不會在保存時拋出通用的GDI +錯誤。這是什麼造成的?

它可能是輸出圖像的大小?我並不完全相信這一點,因爲對於某些文件夾,在創建我的output位圖時,它在位圖的構造函數中拋出一個錯誤。這看起來像一個尺寸問題。我想如果構造函數可以創建它,我不應該能夠保存它嗎?

回答

1

保存圖像需要更多的內存來創建它,因爲內存用於對其進行編碼。 png處理器編碼完全有可能是你的圖像太大。嘗試將其保存爲位圖,只是爲了看到它會起作用。

+0

它的工作將其保存爲位圖。雖然在750MB以下,但它是一個位圖的地獄。 –

+0

那很可能是內存問題。你可能可以通過分批到多個PNG來解決PNG限制。只要確保你卸載舊的PNG(在創建新PNG之前,先將它們的'.dispose')。 –

+0

PNG並非真正的需求,只是一種偏好。我會把它留在BMP。 –