2つのbmpファイルを比較したいと思います。バイナリにBMPファイルを変換するヘッダだけでなく、二つのファイル bmpファイルの比較?
を行うために
- しかし、I:私は2つのアプローチの考えどのように始めるべきか、そしてどちらがより良いアプローチになるかはわかりません。誰かが私を助けてくれたら嬉しいです!
2つのbmpファイルを比較したいと思います。バイナリにBMPファイルを変換するヘッダだけでなく、二つのファイル bmpファイルの比較?
を行うために
私はあなたがこれを実装したいプラットフォーム上で知っているが、ここでは役に立つかもしれないいくつかのコードスニペットありません。
これは、2枚の画像 へを比較するスニペットですそれらが同じかどうかを確認してください。この メソッドは、最初に各ビットマップを バイト配列に変換し、次に各 配列のハッシュを取得します。 のハッシュをループして一致するかどうかを調べます。
/// <summary>
/// method for comparing 2 images to see if they are the same. First
/// we convert both images to a byte array, we then get their hash (their
/// hash should match if the images are the same), we then loop through
/// each item in the hash comparing with the 2nd Bitmap
/// </summary>
/// <param name="bmp1"></param>
/// <param name="bmp2"></param>
/// <returns></returns>
public bool doImagesMatch(ref Bitmap bmp1, ref Bitmap bmp2)
{
...
}
さて、あなたはここで、少なくとも2つのオプションがあります。
をイメージはこの場合、ほとんど
同じですが、私はsplattneのソリューションを使用して比較するお勧めします
画像は通常異なる場合があり、時には同じ
この場合、情報ヘッダー(「同じサイズですか?」と思う)を簡単に比較して2つの画像間の類似性をなくし、情報があいまいである場合にのみ完全な比較を行うことができます(すなわち、サイズが同じである)
あなたはこれを公開するために、すべてのビットマップ上の方法を比較するための.NET 3.0+で拡張メソッドを使用することもできます。
public static bool Compare(this Bitmap bmp1, Bitmap bmp2)
{
//put your comparison logic here
}
あなたは何ですかの比較? 2枚の画像がまったく同じかどうか確認したいですか?あるいは、違いの程度が必要ですか?完全一致の場合は、両方のファイルのハッシュを作成し比較する方法はありますか?
色の濃さだけが異なる2つの画像(1つは32bpp、もう1つは8bpp)があると、上記の解決策はうまくいかなかった。私が使用したLockBitsで、すべての画像を32bppに変換するためのソリューション、Marshal.Copy()を使用して配列にデータを取得し、次に配列を比較しました。
/// <summary>
/// Compares two images for pixel equality
/// </summary>
/// <param name="fname1">first image file</param>
/// <param name="fname2">second image file</param>
/// <returns>true if images are identical</returns>
public static string PageCompare(string fname1, string fname2) {
try {
using (Bitmap bmp1 = new Bitmap(fname1))
using (Bitmap bmp2 = new Bitmap(fname2)) {
if (bmp1.Height != bmp2.Height || bmp1.Width != bmp2.Width)
return false;
// Convert image to int32 array with each int being one pixel
int cnt = bmp1.Width * bmp1.Height * 4/4;
BitmapData bmData1 = bmp1.LockBits(new Rectangle(0, 0, bmp1.Width, bmp1.Height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
BitmapData bmData2 = bmp2.LockBits(new Rectangle(0, 0, bmp2.Width, bmp2.Height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
Int32[] rgbValues1 = new Int32[cnt];
Int32[] rgbValues2 = new Int32[cnt];
// Copy the ARGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(bmData1.Scan0, rgbValues1, 0, cnt);
System.Runtime.InteropServices.Marshal.Copy(bmData2.Scan0, rgbValues2, 0, cnt);
bmp1.UnlockBits(bmData1);
bmp2.UnlockBits(bmData2);
for (int i = 0; i < cnt; ++i) {
if (rgbValues1[i] != rgbValues2[i])
return false;
}
}
}
catch (Exception ex) {
return false;
}
// We made it this far so the images must match
return true;
}
どのような比較をしていますか?それらが同一のコピーであるかどうかチェックしますか?または類似した画像であるかどうか確認したいですか?最初のものは簡単ですし、2番目のものはもう少しトリッキーです。 – Niyaz