Programm erstellen welches Bilder im Ordner vergleicht und doppelte Anzeigt

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Programm erstellen welches Bilder im Ordner vergleicht und doppelte Anzeigt

    Ich hoffe ich bin hier mit dieser Anfrage richtig. Ich würde gerne ein Programm mit C# Windows Forms erstellen welches einen Ausgewählten Ordner
    auf Doppelte Bilder überprüft und diese ANschließend anzeigt.
    Sprich das Bilder in einem Ordner die gleich vom Bild nicht vom Dateinamen sind mir einmal Angezeigt werden. Ich weiß das es fertige Programme bereits gibt.
    Jedoch würde ich gerne selbst eins Erstellen oder zumindest teilst selbst noch bearbeiten könne was die Programmierug angeht.
    Nun du schreibst von einer "Anfrage" scheinst jedoch das Programm selber schreiben zu wollen...

    Ich gehe einfach mal von letzterem aus, und sage dir:
    Ein schönes Ziel. Und nun?

    Wir beantworten dir gerne Fragen zu konkreten Problemen über die du während der Entwicklung deiner Anwendung stolperst. Wir werden dir jedoch nicht dein Programm bis ins Detail vorkauen. Falls du absolut keine Ahnung hast, wo du anfangen sollst, dann schreib auch das, sodass wir dir Tipps geben können, doch mit einer reinen Beschreibung der Funktionalität können wir leider nicht viel anfangen, außer du möchtest das Programmieren lassen. Dann gehört der Thread aber in den Marktplatz.
    Dann werf ich dir mal ein paar Dinge an den Kopf, die du dir ansehen solltest:
    Die Klassen File, Directory, FileInfo und DirectoryInfo aus dem System.IO Namespace werden in diesem Projekt gute Freunde von dir werden. Diese Klassen bieten dir Funktionen zum manipulieren der Daten, entweder in Textform, Byteform, oder mithilfe verschiedener Streams.

    Die Frage ist hier noch, was du unter gleichen Bildern verstehst. Sind diese Bilder ähnlich, oder tatsächlich, vom Header bis zum letzten Pixel gleich? In letzterem Fall brauchst du nur zwei Byte-Arrays miteinander zu vergleichen und kannst die dann Anzeigen. Bei ähnlichen Bildern wird die Sache schon komplizierter.
    Es sind wirklich die gleichen bilder Spich ich mache einen Screenshot als beispiel von Meinem Desktop Kopiere dieses Bild nochmal mit Strg C und Strgv und bennene diese nur um. Wenn ich jetzt sage welchen Ordner er durchsuchen soll schaut er eben nicht nach gleichen namen sondern nach den bildern wie du sagtest die Byte array geschichte
    Hast du vielleicht noch ein paar anfangs punkte für micht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Moritzgs1“ ()

    @Moritzgs1 Pack alle in Frage kommenden Bilder in ein Dictionary(Of FileInfo, Integer).
    FileInfo ist klar, dem Integer-Value weist Du den Hash-Wert der Image-Instanzen zu.
    social.msdn.microsoft.com/Foru…of-images?forum=vbgeneral
    Diese Hash-Werte musst Du alle miteinander vergleichen.
    Sind die Werte unterschiedlich, sind die Bilder verschieden.
    Sind die Werte gleich, besteht die Möglichkeit, dass die Bilder identisch sind. Dann musst Du weiter dran arbeiten.
    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!
    @Moritzgs1 Hier ein paar Stichpunkte. Arbeite diese in der Reihenfolge ab. Diese Stichpunkte sind sehr einfach (anfängergerecht) gehalten. Natürlich gibt's schlauere Sachen, aber wie gesagt, mach das erstmal. Und ich schreibe in VB.NET, aber du kannst es mit einem Converter umwandeln.
    • CommonOpenFileDialog1, um das erste Bild zu laden
    • CommonOpenFileDialog2, um das zweite Bild zu laden
    • das Laden geht mit

      VB.NET-Quellcode

      1. Dim Picture1 As New Bitmap(Name1)
      2. Dim Picture2 As New Bitmap(Name2)

    • dann schreibst du dir eine Funktion Vergleiche, die die Bilder vergleicht und true oder false zurückgibt

    VB.NET-Quellcode

    1. Dim Ergebnis As Boolean = Vergleiche(Picture1, Picture2)
    2. If Ergebnis Then
    3. Label1.Text = "Gleich"
    4. Else
    5. Label1.Text = "verschieden"
    6. PictureBox1.Image = Picture2
    7. End If
    • Bild1 brauchst du nicht mehr, kannst du also aufräumen
    Picture1.Dispose()

    In der besagten Funktion vergleichst du Pixelfarbe für Pixelfarbe, ein Pixel nach dem anderen. (Stell dir das wie ein Gitternetz vor ^^ ) Hier ist es wichtig, darauf zu achten, wie breit oder hoch beide Bilder sind, weil du kannst ja nicht das 1000te Pixel in Bild 2 anfahren, wenn's gar keines gibt...Von daher sicherheitshalber schauen, wie weit du gehen darfst.

    VB.NET-Quellcode

    1. Dim Xmax_W As Integer = Math.Min(Pic1.Width, Pic2.Width)
    2. Dim Ymax_H As Integer = Math.Min(Pic1.Height, Pic2.Height)


    Jetzt machst du die oben genannten 2 For-Schleifen ineinander.

    VB.NET-Quellcode

    1. For y As Integer = 0 To Ymax_H - 1 Step 1
    2. For x As Integer = 0 To Xmax_W - 1 Step 1


    Schau dir GetPixel an. Wenn zu oft* Pixel verschieden sind, soll die Funktion False (für nicht gleich) zurückmelden.

    *Definier du, was zu oft heißt (1 Mal, 10 Mal, ...), weil es kann ja passieren, dass zwei Landschaftsaufnahmen von Dir aus gleich sind, für den Computer aber nicht, weil sich ein ganz bisschen Wind durch's Gras geweht hat, es de facto aber dieselben Aufnahmen sind, weißt wie ich mein

    Wie gesagt, geht alles noch besser ( mit lockBits), aber so erstmal versuchen. Wenn du die beiden Bilder vergleichen kannst, dann kannst du dich daran machen, nen ganzen Ordner einzulesen


    PS: Wenn du einen guten OpenFileDialog haben kennenlernen möchtest, lade dir über den Visual Studio -eigenen Nuget-Manager den Microsoft.WindowsAPICodePack.Dialogs herunter und importier ihn in Zeile 1
    Imports Microsoft.WindowsAPICodePack.Dialogs
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Vielen Dank blicke da noch nicht ganz durch aber werde es nachher mal versuchen falls du noch tipps hast die ich brauchen könnte immer her damit. PS Bin
    noch ziemlich am Anfang was Programmieren angeht. Bisher nur Webbrowser, Taschenrechner ud ein Checklisten Programm für Arbeitsabläufe.
    Setz dich hin und denk nach. Du musst einmal verstanden haben, was das Programm macht und wie du es mit Codezeilen umsetzt.
    • Bilder öffnen
    • die Pixel von Bild 1 mit dem Pixel von Bild 2 vergleichen (denn pro Pixel gibt es 3 Farben: Rot, Grün, Blau – alle mit Werten von 0 bis 255). Du brauchst also 2 Variablen vom Datentyp Color

      VB.NET-Quellcode

      1. Dim pixelColor1 As Color
      2. Dim pixelColor2 As Color

    • Anzahl der nicht gleichen Pixel hochzählen und mit dem Schwellwert vergleichen
    • Entscheidung treffen.
    • In PictureBox anzeigen
    und mach die doppelte For-Schleife und nutze GetPixel

    VB.NET-Quellcode

    1. pixelColor1 = Pic1.GetPixel(x, y)
    2. pixelColor2 = Pic2.GetPixel(x, y)


    Und jetzt gehst du bei und vergleichst die beiden Farben dieses Pxels.

    VB.NET-Quellcode

    1. If pixelColor1 <> pixelColor2 Then

    Nun das nächste Pixel...

    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    @Moritzgs1 Ich rate Dir dringend, vom Code von @Bartosz und auch von diesem Problem Abstand zu nehmen!
    Es wäre besser, wenn Du Dich zunächst etwas intensiver mit den Grundlagen der Programmierung befasst, um ein besseres Gefühl für .NET zu bekommen.
    [Sammelthread] Programmieren, aber was? (Programmideen)
    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!
    @Bartosz Das ganze Problem ist schon nichts für Anfänger. Hätte er jetzt gesagt er möchte Dateien vergleichen wäre das für ihn machbar. Aber gleich Bilder mit ein wenig Grundlagen ist zu viel. Ich habe keine Ahnung wie man Bilder überprüft, aber was du da beschrieben hast ist selbst für mich nichts. Und @RodFromGermany arbeitet beruflich in der Abteilung soweit ich das mal gelesen habe. Er weiß wie schwer es ist.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Moritzgs1 schrieb:

    Kopiere dieses Bild nochmal mit Strg C und Strgv und bennene diese nur um
    Aber in dem Fall hilft doch die Variante aus Post#6.
    Da müssen nicht die einzelnen Pixel verglichen werden.
    Im schlimmsten Fall (bei gleichem Hash) kann man ja noch den Dateiinhalt vergleichen.
    Das müsste auch für einen Anfänger möglich sein.

    Für den zweiten Teil (ohne Hash) gibt es sogar ein C#-Lernprojekt auf Microsoft Docs.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Cheffboss schrieb:

    MD5-Wert
    Siehe Link in Post #6. ;)
    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!

    Cheffboss schrieb:

    was meint Ihr dazu?
    Ich meine, dass sich der TE seit Montagnachmittag nicht mehr an der Diskussion beteiligt.
    Entweder er ist erschlagen von der Diskussion oder er hat kein Interesse mehr oder er hat selbst eine Lösung gefunden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --