Как сравнить два изображения с помощью байтовых массивов - PullRequest
17 голосов
/ 07 января 2012

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

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

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!

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

Спасибо!

Ответы [ 4 ]

15 голосов
/ 07 января 2012

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

Поскольку это два разных byte[] объекта, ссылки различаются.

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

2 голосов
/ 07 января 2012

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

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

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

2 голосов
/ 07 января 2012

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

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

1 голос
/ 07 января 2012

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

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

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

...