Подтвердить что ты не робот

Как сравнить два изображения с использованием байтовых массивов

Я хочу, чтобы иметь возможность конвертировать из Byte [] в Image и наоборот.

У меня есть два метода из здесь:

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
    MemoryStream ms = new MemoryStream();
    imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
    return  ms.ToArray();
}

public Image byteArrayToImage(byte[] byteArrayIn)
{
     MemoryStream ms = new MemoryStream(byteArrayIn);
     Image returnImage = Image.FromStream(ms);
     return returnImage;
}

Они, похоже, работают, но если я это сделаю:

byte[] pic = GetImageFromDb();
bool result = pic == imageToByteArray(byteArrayToImage(pic));

Я получаю result = false!

Любой способ исправить эти методы или некоторые другие функции для достижения моей цели?

Спасибо!

4b9b3361

Ответ 1

Использование == будет сравнивать ссылки на объекты, если они не переопределены.

Так как это два разных объекта byte[], ссылки разные.

Вам нужно сравнить элемент byte[] объектов по позиции, чтобы подтвердить, что они идентичны. Вы можете использовать SequenceEquals в этом случае.

Ответ 2

== означает, что у вас есть ссылка на тот же объект в памяти.

В этом показано, как сравнивать байтовые массивы несколькими способами.

Ответ 3

Мне недавно нужно было написать обрезку изображения, которая должна была сохранить файлBytes в качестве изображения. вот что я сделал. Надеюсь, это поможет вам.

public Image byteArrayToImage(byte[] fileBytes)
{
    using (MemoryStream fileStream = new MemoryStream(fileBytes))
    {
        return Image.FromStream( fileStream );
    }
}

очевидно, мой код для обрезки/сохранения расширяется при этом. Но я смог вернуть объект Image из байтов файла.

Ответ 4

При повторном кодировании изображения результирующий файл (или байтовый массив) может (немного?) отличаться от исходной. Особенно, если вы получили из базы данных файл jpeg!

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

ИЗМЕНИТЬ
Когда вы читаете байт [] (содержащий GIF-кодированное изображение) в BitMap, эти байты декомпрессируются в 4 (ARGB) байта на пиксель. Когда вы сохраняете этот битмап в (новом) файле gif (или байте []), новый кодированный файл может отличаться (например, порядок, в котором хранятся цвета). Таким образом, нет гарантии, что новый файл (или байт []) идентичен предыдущему, хотя само изображение не изменяется.