如何修复控制台应用程序异常“ System.Drawing.dll中的''System.ArgumentException'”

时间:2019-06-04 05:11:02

标签: c# bitmap system.drawing

我正在尝试创建一个脚本,将图像列表与一个比较图像进行比较,并写入不同图像的文件名。我将它制作为控制台应用程序,因为我不需要显示任何图像。我添加了System.Drawing参考,但是当我运行代码时,我得到了消息: ArgumentException: Parameter is not valid.

详细信息:

System.TypeInitializationException
  HResult=0x80131534
  Message=The type initializer for 'ConsoleApp2.Program' threw an exception.
  Source=<Cannot evaluate the exception source>
  StackTrace:
<Cannot evaluate the exception stack trace>

Inner Exception 1:
ArgumentException: Parameter is not valid.

输出显示:

  

引发的异常:System.Drawing.dll中的“ System.ArgumentException”   在未知模块中发生了类型为'System.TypeInitializationException'的未处理异常。   “ ConsoleApp2.Program”的类型初始值设定项引发了异常。

我不确定为什么会引发异常。删除对System.Drawing的引用并注释所有使用位图的代码将停止该异常,尽管这样做不是很有用。

这是我正在运行的代码:

static Bitmap comparison = new Bitmap("Comparison.jpg");
static void Main(string[] args)
{
    string[] fileArray = Directory.GetFiles(filepath);

    string compare = AnalyzeBitmap(comparison);

    foreach(string file in fileArray)
    {
        Bitmap hold = null;
        hold = new Bitmap(file);
        AnalyzeBitmap(hold);
        if (hold.Equals(compare))
        {
            Console.WriteLine(file);        
        }
    }

    Console.ReadKey();
}
AnalyzeBitmap():
static string AnalyzeBitmap(Bitmap bmp)
{
    var data = bmp.LockBits(
                           new Rectangle(Point.Empty, comparison.Size),
                           ImageLockMode.ReadWrite, 
                           comparison.PixelFormat
                           );

    var pixelSize = data.PixelFormat == PixelFormat.Format32bppArgb ? 4 : 3;
    var padding = data.Stride - (data.Width * pixelSize);
    var bytes = new byte[data.Height * data.Stride];

    // copy the bytes from bitmap to array
    Marshal.Copy(data.Scan0, bytes, 0, bytes.Length);

    var index = 0;
    var builder = new StringBuilder();

    for (var y = 0; y < data.Height; y++)
    {
        for (var x = 0; x < data.Width; x++)
        {
            Color pixelColor = Color.FromArgb(
                            pixelSize == 3 ? 255 : bytes[index + 3], // A component if present
                            bytes[index + 2], // R component
                            bytes[index + 1], // G component
                            bytes[index]      // B component
                            );

            builder
                   .Append("  ")
                   .Append(pixelColor.R)
                   .Append("     ")
                   .Append(pixelColor.G)
                   .Append("     ")
                   .Append(pixelColor.B)
                   .Append("     ")
                   .Append(pixelColor.A)
                   .AppendLine();



            index += pixelSize;
        }

        index += padding;
    }

    // copy back the bytes from array to the bitmap
    Marshal.Copy(bytes, 0, data.Scan0, bytes.Length);

    return builder.ToString();

}

1 个答案:

答案 0 :(得分:1)

问题是这条线

StatusColor color;
if (lookup.TryGetValue("#ffffff", out color))
{
    Console.WriteLine(color.ToString());
}
else
{
    // not found
}

因为TypeInitializationException是一个内部异常,仅当在静态构造函数或静态字段初始化程序中发生异常时才抛出该异常。在您的情况下,没有静态构造函数,而只有该静态字段初始化程序。

我认为指定的文件不存在。 请检查您的应用程序的输出路径中是否有一个名为Compare.jpg的文件。

您还应该将Bitmap实例包装在using语句中,然后将静态Bitmap转换为局部变量。 参见:What are the uses of "using" in C#