生成图像时的通用GDI +?

时间:2014-02-07 20:53:49

标签: c# gdi+

我正在加载与特定文件名掩码(*.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的构造函数中抛出错误。这似乎是一个规模问题。我想如果构造函数可以创建它,我应该不能保存它吗?

1 个答案:

答案 0 :(得分:1)

保存图像需要更多的内存来创建它,因为内存用于对其进行编码。完全有可能你的图像太大,png处理器无法进行编码。尝试将其保存为位图,只是为了看它会起作用。