Как сравнить Объекты изображения с.NET C#? [закрытый]

13
задан Louis Rhys 2 August 2010 в 04:22
поделиться

2 ответа

Вы можете использовать набор инструментов под названием TestApi , который представляет собой библиотеку с открытым исходным кодом для помощи в модульном тестировании. Один из таких API называется Visual Verification API , и он делает именно то, что вам нужно - он может сравнивать два изображения и сообщать вам, равны ли они:

// 1. Capture the actual pixels from a given window
Snapshot actual = Snapshot.FromRectangle(new Rectangle(0, 0, 100, 100));

// 2. Load the reference/master data from a previously saved file
Snapshot expected = Snapshot.FromFile("Expected.png"));

// 3. Compare the actual image with the master image
//    This operation creates a difference image. Any regions which are identical in 
//    the actual and master images appear as black. Areas with significant 
//    differences are shown in other colors.
Snapshot difference = actual.CompareTo(expected);

// 4. Configure the snapshot verifier - It expects a black image with zero tolerances
SnapshotVerifier v = new SnapshotColorVerifier(Color.Black, new ColorDifference());

// 5. Evaluate the difference image
if (v.Verify(difference) == VerificationResult.Fail)
{
    // Log failure, and save the diff file for investigation
    actual.ToFile("Actual.png", ImageFormat.Png);
    difference.ToFile("Difference.png", ImageFormat.Png);
}
12
ответ дан 1 December 2019 в 23:46
поделиться

Проще всего начать с размеров. Если размеры не равны, вы можете объявить их ложными.

Если вам нужно просмотреть их попиксельно, вам понадобятся два цикла for. Что-то вроде этого:

Bitmap ImageA...
Bitmap ImageB...

for ( Int64 x = 0; x < ImageA.Width; x++ )
{
     for ( Int64 y = 0; y < ImageA.Height; y++ )
     {
         if ( ImageA.GetPixel(x, y) != ImageB.GetPixel(x, y) )
         {
            return false;
         }
     }
}

Это псевдокод (функции существуют на C #, хотя я не могу вспомнить их в данный момент) и очень упрощенный, но именно так вы хотели бы выполнить базовую операцию «пиксель в пиксель». чек.

Обратите внимание, однако, что для того, чтобы этот цикл работал, изображения должны быть одинакового размера. Если это не так, вы, вероятно, получите исключения, если попытаетесь выбрать пиксель за пределами области меньшего размера. Также будет не очень быстро сравнивать пиксели, поэтому вы можете сначала найти другой способ отбросить возможные дубликаты.

Изменить: я не знаю, как это сделать с изображением , но это довольно просто для Bitmap s. Нет видимого способа получить данные пикселей изображения из класса. Однако похоже, что растровые изображения наследуются от изображений, поэтому это все еще может работать. Учитывая, что изображения являются абстрактным классом как для растровых изображений, так и для метафайлов, они могут не иметь простого внутреннего списка пикселей.

4
ответ дан 1 December 2019 в 23:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: