web-dev-qa-db-fra.com

Comment comparer deux images à l'aide de tableaux d'octets

Je veux pouvoir convertir de l'octet [] en image et inversement.

J'ai ces deux méthodes de ici :

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;
}

Ils semblent travailler, mais si je le fais:

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

Je reçois result = false!

Toute façon de corriger ces méthodes ou certaines fonctions différentes pour atteindre mon objectif?

Merci!

17
Diego

À l'aide de == comparera les références d'objet si elles ne sont pas remplacées.

Puisqu'ils sont deux différents byte[] Objets, les références sont différentes.

Vous devez comparer le byte[] Objets Objet article par article afin de confirmer qu'ils sont identiques. Vous pouvez utiliser SequenceEquals dans ce cas.

16
Oded

== signifie que vous avez une référence au même objet en mémoire.

Ceci montre comment comparer les matrices d'octets de différentes manières.

2
Mark Avenius

Je devais récemment écrire une image Cropper nécessaire pour enregistrer les fichiersbytes comme une image. Voici ce que j'ai fait. Espérons que cela vous aidera.

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

évidemment, mon code pour le recadrage/la sauvegarde se développe. Mais j'ai pu retourner un objet d'image à partir des octets de fichier.

2
Tom

Lorsque vous réécrivez une image, le fichier résultant (ou le tableau d'octets) peut être (légèrement?) Différent de la version d'origine. Surtout si ce que vous récupérez de la base de données était un fichier JPEG!

Donc, même si vous comparez les octets dans les tableaux (au lieu de références), vous pouvez obtenir des différences.

ÉDITER
[.____] Lorsque vous lisez un octet [] (contenant une image codée GIF) dans un BitMap, ces octets sont décompressés dans 4 octets (Argb) par pixel. Lorsque vous enregistrez ce bitmap dans un fichier gif (neuf) gif (ou octet []), le fichier nouvellement codé pourrait être différent (par exemple, l'ordre dans lequel les couleurs sont stockées). Il n'ya donc aucune garantie que le nouveau fichier (ou octet []) est identique à l'ancien, bien que l'image elle-même ne soit pas modifiée.

1
Hans Kesting