Захваченный экран и преобразование в Byte[] (методы сравнения изображений)

Я написал несколько сообщений о сравнении изображений и попытался сохранить изображение, снятое с экрана, а затем сохранить его в файловой системе.

Я использовал методы преобразования, чтобы преобразовать захваченное изображение в byte[] для последующего использования.

Затем, когда я хочу сравнить его со вторым снимком экрана, я загружаю (файл, сохраненный в byte[]) и сравниваю его с новым снимком, который таким же образом преобразован в byte[].

Теперь, когда в памяти есть как 1-й захват, так и 2-й захват, было несколько способов провести сравнение, я хотел сначала поделиться этим сообщением с другими, ищущими тот же ответ, и чтобы я знал:

Что быстрее и как контролировать процент сходства?

Если вариант иметь процент (равенства) противоречит самому быстрому способу вычисления... Я могу игнорировать его, хотя я мог бы использовать его в других проектах, когда проблемы с производительностью нет, и в соответствии с его потребностями

Это коды, которые я знаю, доступные для выполнения задачи

Я хотел обсудить с вами идеи, которые быстрее, и есть ли лучший способ вообще с процентом равенства и без него. Спасибо.

static bool ByteArrayCompare(byte[] a1, byte[] a2)
{     
  IStructuralEquatable eqa1 = a1;     
  return eqa1.Equals(a2, StructuralComparisons.StructuralEqualityComparer); 
} 

vs

public enum CompareResult
{
  ciCompareOk,
  ciPixelMismatch,
  ciSizeMismatch
};

CompareResult cr = CompareResult.ciCompareOk;

byte[] hash1 = shaM.ComputeHash(btImage1);
byte[] hash2 = shaM.ComputeHash(btImage2);

//Compare the hash values
for (int i = 0; i < hash1.Length && i < hash2.Length 
                  && cr == CompareResult.ciCompareOk; i++)
{
    if (hash1[i] != hash2[i])
        cr = CompareResult.ciPixelMismatch;
}

последний использует System.Security.Cryptography


person LoneXcoder    schedule 31.08.2012    source источник
comment
Пожалуйста, прокомментируйте, чего вы хотите достичь: 2 фрагмента кода делают совершенно разные вещи (побитовое сопоставление и хэш-сопоставление), поэтому невозможно сравнить, какой из них быстрее для вашей конкретной задачи. Сравнение хэш-кода будет быстрее (из-за постоянного размера хэшей SHAxxx), но нет гарантий равенства.   -  person Alexei Levenkov    schedule 01.09.2012
comment
@AlexeiLevenkov независимо от того, хэш или нет, задача состоит в том, чтобы сравнить захваченный1 с захваченным2 (использует преобразование в байт [] для начала, делает более возможным достижение скорости при сравнении проблемы? Я начал с первого сохранения изображения на диск и преобразовать img в img, но тот, что в буфере обмена, не соответствует тому, который прошел процесс сохранения   -  person LoneXcoder    schedule 01.09.2012
comment
ComputeHash - это первый шаг (еще 1), не сделал ли он (процедура покрытия) больше времени, выполняя еще 1 работу по обоим предметам, хотя хэш 2 быстрее, но ему нужно было добраться туда 1-й из byte[]   -  person LoneXcoder    schedule 01.09.2012
comment
Не комментируя функции, но однажды был задан вопрос о сравнении изображений, и он получил достойный ответ в отношении API, который вы можете использовать для их сравнения. Затем он сообщит вам о различиях между изображениями: stackoverflow.com/a/3385221/146205   -  person Jensen    schedule 01.09.2012


Ответы (1)


Сравнение изображений и сравнение байтовых массивов/содержимого файла — это две разные задачи, так как формат изображения может вызывать опасения. Итак, если вы заинтересованы в сравнении байтов (т.е. если один и тот же код, используемый для захвата изображений, должен быть одинаковым). В противном случае вам нужно искать вопросы «сравнить изображения» (например, один Как сравнивать объекты Image с C# .NET? предложено Дженсеном Сомерсом).

Чтобы сравнить байтовые массивы/файлы, вам в конечном итоге потребуется сравнить байтовое содержимое по байтам. Вы можете оптимизировать проверки, чтобы ничего не делать для случаев, когда байтовые массивы/файлы определенно не будут совпадать, и выполнять сравнение байтов только в случае крайней необходимости:

  • проверьте, совпадают ли размеры
  • проверять хэши массивов/файлов (кэшировать вычисленные хеш-значения, т.к. вычисление хэша каждый раз не будет быстрее, чем побайтовое сравнение). Хэши SHAxxxx хороши, но подойдет любая разумная хеш-функция, даже несколько случайно взятых байтов массивов. Просто выбирая значения из массива, вы можете вообще избежать кэширования хэшей.
  • сравните фрагмент массивов фиксированного размера (т. е. где-то посередине для изображений), если вы ожидаете, что файлы будут отличаться чаще, чем одинаковые.

Если выше сказано, что массивы/файлы могут быть одинаковыми (одинаковая длина/хеш/частичное содержимое), тогда сравнивайте массивы/файлы побайтно.

person Alexei Levenkov    schedule 31.08.2012