2 Screenshots vergleichen



  • Hallo @all,

    ich habe das folgende Problem:
    Ich möchte gerne 2 Bilder miteinander vergleichen (Pixelgenau).

    // Die folgenden 2 Eingabewerte werden vorher gesetzt
    HBITMAP hbm;   // Bitmap des Screenshots
    HDC     hdc;   // HDC des Screenshost
    
    // GetDIBits verwenden
    BITMAP bm;
    ::GetObject(hbm, sizeof(bm) &bm); // Bitmap-Eigenschaften ermitteln
    
    BITMAPINFO bmi;
    
    bmi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth        = bm.bmWidth;
    bmi.bmiHeader.biHeight       = bm.bmHeight;
    bmi.bmiHeader.biBitCount     = bm.bmBitsPixel;
    bmi.bmiHeader.biPlanes       = bm.bmPlanes;
    bmi.bmiHeader.biCompression  = BI_RGB;
    bmi.bmiHeader.biSizeImage    = bm.bmBitsPixel * bm.bmWidth * bm.bmHeight / 8;
    
    BYTE *pbyteBitmapBits = new BYTE[bmi.bmiHeader.biSizeImage];
    
    ::GetDIBits( hdc, 
                 hbm,
                 0,
                 bmi.bmiHeader.biHeight,
                 pbyteBitmapBits,
                 &bmi,
                 DIB_RGB_COLORS );
    
    UINT hash = HashKey(pbyteBitmapBits); 
    
    delete pbyteBitmapBits;
    

    Das Problem besteht nun darin, dass anscheinend pbyteBitmapBits anscheinend durch GetDIBits nicht korrekt gesetzt wird, daher erhalte ich immer denselben Hashwert, auch wenn sich die Bilder unterscheiden.
    Woran könnte das liegen? 😕



  • 2 Screenshots vergleichen - hab da ne anwendung programmiert, die gneau das macht - aber mit C++ und WinAPI

    vielleicht hilfts ja:
    http://turing.fh-landshut.de/~jamann/upload/diff.zip



  • Hallo Vertexwahn,

    danke für den Upload! 🙂

    Ich habe meinen Code noch mal überprüft und pbyteBitmapBits enthält anscheinend den korrekten Wert.
    Der Fehler müsste also bei der Hashfunktion liegen.

    Kennt jemand eine Möglichkeit aus pbyteBitmapBits einen korrekten Hashwert zu ermitteln? 😕


Anmelden zum Antworten