11. April 2011

Bitmaps in .net vergleichen

...funktioniert nicht xD

Naja, zumindest nicht direkt.
Die "Equals"-Methode sowie der Vergleichsoperator verwenden lediglich Referenzen,
der Inhalt wird dabei nicht berücksichtigt :-s


Jedoch, komplett hilflos ist man nicht ;)

Eine Möglichkeit ist, die Bilder in Bytearrays auszulesen
und diese, zuerst nach Größe, dann Byte für Byte zu vergleichen.

Klingt nicht ziemlich effizient,
denke ist es auch nicht -.-
Aber solange ich keine optimalere Möglichkeit gefunden habe, werde ich wohl bei diesem Weg bleiben müssen.

Codemäßig in Visual C++.net sieht das folgendermaßen aus:


   1:  // compare

   2:  {
   3:      System::IO::MemoryStream ^stream = gcnew System::IO::MemoryStream();
   4:      System::Drawing::Bitmap ^bm = System::Drawing::Bitmap::FromFile("file");
   5:      bm->Save(stream, System::Drawing::Imaging::ImageFormat::Bmp);
   6:      stream->Flush();
   7:      array ^arr = stream->ToArray();
   8:   
   9:      stream = gcnew System::IO::MemoryStream();
  10:      bm = System::Drawing::Bitmap::FromFile("otherfile");
  11:      bm->Save(stream, System::Drawing::Imaging::ImageFormat::Bmp);
  12:      stream->Flush();
  13:      array ^arr2 = stream->ToArray();
  14:   
  15:      if (arr->Length != arr2->Length)
  16:      {
  17:          // sure not equal
  18:      }
  19:      else
  20:      {
  21:          int length = arr->Length;
  22:          for (int i = 0; i < length; ++i)
  23:          {
  24:              if (arr[i] != arr2[i])
  25:              {
  26:                  // not equal
  27:                  break;
  28:              }
  29:          }
  30:      }
  31:  }



Mit obigen code snippet ist es jedoch leider nur möglich,
zu vergleichen ob die Bilder komplett ident sind.
Für Ähnlichkeiten oder um herauszufinden, ob sich in einem bestimmten Bild ein anderes befindet bietet sich eine so genannte "pattern recognition" an.
(Erster Google Link auf tutorials.de)


Viel Erfolg und happy coding :D

the incredible Leitman

Keine Kommentare: