web-dev-qa-db-ja.com

バイト配列を使用して2つの画像を比較する方法

Byte []からImageに、またはその逆に変換できるようにしたい。

私は here からこの2つのメソッドを取得しました:

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

この方法またはいくつかの異なる機能を修正して私の目標を達成する方法はありますか?

ありがとう!

17
Diego

==を使用すると、オーバーライドされていない場合、オブジェクト参照が比較されます。

これらは2つのdifferentbyte[]オブジェクトであるため、参照は異なります。

byte[]オブジェクトをアイテムごとに比較して、それらが同一であることを確認する必要があります。この場合、 SequenceEquals を使用できます。

16
Oded

==は、メモリ内に同じオブジェクトへの参照があることを意味します。

This は、バイト配列をいくつかの異なる方法で比較する方法を示しています。

2
Mark Avenius

最近、fileBytesを画像として保存する必要がある画像クロッパーを作成する必要がありました。これが私がしたことです。うまくいけば、これはあなたを助けるでしょう。

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

明らかに、クロッピング/保存のための私のコードはこれを拡張しています。しかし、ファイルバイトからImageオブジェクトを返すことができました。

2
Tom

画像を再エンコードすると、結果のファイル(またはバイト配列)が元のバージョンと(わずかに?)異なる場合があります。特に、データベースから取得したものがjpegファイルの場合は!

したがって、たとえ参照ではなく配列のバイトを比較しても、違いが生じる可能性があります。

[〜#〜]編集[〜#〜]
バイト[](GIFエンコードされた画像を含む)をBitMapに読み込むと、それらのバイトはピクセルごとに4(ARGB)バイトに解凍されます。そのビットマップを(新しい)gifファイル(またはbyte [])に保存すると、新しくエンコードされたファイルが異なる場合があります(たとえば、色が格納される順序)。したがって、画像自体は変更されませんが、新しいファイル(またはbyte [])が古いファイルと同一である保証はありません。

1
Hans Kesting