Как сравнить два изображения с использованием байтовых массивов
Я хочу, чтобы иметь возможность конвертировать из 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
!
Любой способ исправить эти методы или некоторые другие функции для достижения моей цели?
Спасибо!
Ответы
Ответ 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 (или байте []), новый кодированный файл может отличаться (например, порядок, в котором хранятся цвета). Таким образом, нет гарантии, что новый файл (или байт []) идентичен предыдущему, хотя само изображение не изменяется.