Bild doch nur gedreht?? Prüfung auf Veränderung. Idee gesucht.

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von mausekeks.

    Bild doch nur gedreht?? Prüfung auf Veränderung. Idee gesucht.

    Moin!

    ich habe ein Programm erstellt bei dem Verzeichnisse und deren Dateien in einer Quelle und einem Ziel verglichen werden.

    Ist eine Datei nur in der Quelle vorhanden wird diese in das Ziel kopiert. Ist eine Datei bereits am Ziel vorhanden, wurde aber zwischenzeitlich verändert, dann kommt es zu einer Fehlermeldung. In der Regel ist das auch OK.

    Eine Vielzahl der Dateien sind nur Fotos von Objekten die von den Anwendern gedreht werden. Das ist auch OK und hier wird auch kein neuer Name vergeben. Das Problem ist nur, dass dieses als Fehler ausgeworfen wird.

    Nun hatte ich mir überlegt, ob ich nicht irgendwie feststellen kann ob eine Datei gedreht wurde. Dann wurde ich nochmal an das Ziel kopieren.

    In den Exif-Daten meiner Musterdateien habe ich bisher keinen Hinweis gefunden und die Größe der Dateien hat sich in der Regel auch nur vergrößert. Auch wenn ein Bild zunächst um 90 Grad gedreht wird und dann nochmal um 270 Grad, dann hat sich die Größe verändert, obwohl eigentlich wieder das Ausgangsbild vorliegt.

    Weiß einer mehr oder hat eine andere (einfache) Idee zu testen, ob das Bild nur gedreht wurde??

    Gruß Jan

    jan99 schrieb:

    ob das Bild nur gedreht wurde
    bekommst Du nicht raus. Leider.
    Ich gehe mal davon aus, dass es sich um JPG-Dateien handelt, und die werden beim Speichern verlustbehaftet komprimiert.
    Am besten, überschreib die Bilder mit den Originalen und feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi @jan99,

    wie vergleichst du denn aktuell ob zwei Dateien Identisch sind?
    • über den Hash?
    Wenn ja, ist der Hashwert bei dem Original Bild und dem rotierten unterschiedlich ?
    • schätze ja da sich laut dir ja die Größe der Datei ändert

    Wenn du überprüfen möchtest ob die zwei Dateien Identisch sind wäre jetzt meine Idee (nur eine Idee) beide Bilder einzulesen und und diese dann vergleichen ?
    Und bei n Dateien jede einzulesen und diese in jeder Drehung zu Vergleichen wird ziemlich rechenintensiv ergo Zeitaufwendig.

    Ich denke aber Das Problem ist die Drehung.
    Du müsstest erstmals wissen ob die Datei gedreht wurde dann müsstest du sie zurückdrehen, vergleichen und dann wieder in den Ursprung zurückversetzen.

    Ich habe das gerade mal ausprobiert mit dem vergleichen 2er Bilder, bei einem gedrehten Bild ist das Ergebnis false.

    Code ist unsafe (war nur zum Testen)

    C#-Quellcode

    1. private unsafe bool CompareBitmap(Bitmap bmp, Bitmap bmp1)
    2. {
    3. bool isEqual = true;
    4. Rectangle rectSize = new Rectangle(0, 0, bmp.Width, bmp.Height);
    5. BitmapData bmpData = bmp.LockBits(rectSize, ImageLockMode.ReadOnly, bmp.PixelFormat);
    6. BitmapData bmp1Data = bmp1.LockBits(rectSize, ImageLockMode.ReadOnly, bmp1.PixelFormat);
    7. unsafe
    8. {
    9. byte* pointer = (byte*)bmpData.Scan0.ToPointer();
    10. byte* pointer1 = (byte*)bmp1Data.Scan0.ToPointer();
    11. //for 24BitPerPixel
    12. //1Byte = 8Bit
    13. //8 * 3 = 24(Bpp)
    14. int width = rectSize.Width * 3;
    15. for (int i = 0; isEqual && i < rectSize.Height; i++)
    16. {
    17. for (int x = 0; x < width; x++)
    18. {
    19. switch (*pointer != *pointer1)
    20. {
    21. case true:
    22. {
    23. isEqual = false;
    24. }
    25. break;
    26. }
    27. pointer++;
    28. pointer1++;
    29. }
    30. pointer += bmpData.Stride - width;
    31. pointer1 += bmp1Data.Stride - width;
    32. }
    33. bmp.UnlockBits(bmpData);
    34. bmp1.UnlockBits(bmp1Data);
    35. return isEqual;
    36. }
    37. }




    Vil hilft dir das Ja weiter oder wer anderes hier hat noch eine Bessere Idee(warscheinlich jeder^^) für dich.

    Lg

    Mauskekes


    \\Edit: Rod war schneller, ergebnis das selbe sry.
    Brain is Loading: 35%