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
位圖時,它在位圖的構造函數中拋出一個錯誤。這看起來像一個尺寸問題。我想如果構造函數可以創建它,我不應該能夠保存它嗎?
它的工作將其保存爲位圖。雖然在750MB以下,但它是一個位圖的地獄。 –
那很可能是內存問題。你可能可以通過分批到多個PNG來解決PNG限制。只要確保你卸載舊的PNG(在創建新PNG之前,先將它們的'.dispose')。 –
PNG並非真正的需求,只是一種偏好。我會把它留在BMP。 –