Как исправить исключение консольного приложения "System.ArgumentException" в System.Drawing.dll " - PullRequest
2 голосов
/ 04 июня 2019

Я пытаюсь создать скрипт, который сравнивает список изображений с одним изображением сравнения и записывает имя файла изображения, которое отличается.Я сделал это консольное приложение, так как мне не нужно было отображать изображения.Я добавил ссылку 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.ArgumentException» в System.Drawing.dll Произошло необработанное исключение типа «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 Ответ

1 голос
/ 04 июня 2019

Проблема заключается в этой строке

static Bitmap comparison = new Bitmap("Comparison.jpg");

, поскольку исключение TypeInitializationException является внутренним исключением, которое генерируется только в том случае, если исключение происходит в статическом конструкторе или инициализаторе статического поля.В вашем случае нет статического конструктора и только этот инициализатор статического поля.

Я думаю, что указанный файл не существует.Пожалуйста, проверьте, есть ли файл с именем Comparison.jpg в выходном пути вашего приложения.

Вам также следует заключить экземпляры Bitmap в оператор using и, следовательно, преобразовать статический Bitmap в локальную переменную.Смотрите: Каковы виды использования "using" в C #

...