Я пытаюсь создать скрипт, который сравнивает список изображений с одним изображением сравнения и записывает имя файла изображения, которое отличается.Я сделал это консольное приложение, так как мне не нужно было отображать изображения.Я добавил ссылку 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();
}