我正在加载与特定文件名掩码(*.tif
)匹配的文件夹中的所有图像。一次一个,我正在拉动图像的一部分并将其放入输出图像中,并在其旁边我DrawString
标记它来自哪个文件。当我保存输出图像时,我有时会得到一个通用的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 +错误。造成这种情况的原因是什么?
可能是输出图像的大小吗?我并不是100%相信这一点,因为在创建我的output
位图时,在某些文件夹中它会在Bitmap的构造函数中抛出错误。这似乎是一个规模问题。我想如果构造函数可以创建它,我应该不能保存它吗?
答案 0 :(得分:1)
保存图像需要更多的内存来创建它,因为内存用于对其进行编码。完全有可能你的图像太大,png处理器无法进行编码。尝试将其保存为位图,只是为了看它会起作用。