Programm zum Vergleichen von Fotografien

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von singapurtaucher.

    Programm zum Vergleichen von Fotografien

    Ich versuche seit geraumer Zeit ein programm in VB 2010 Express zu schreiben, das mir aus einem bestimmten Ordner zwei beliebige Bilder in pictures-boxes anzeigt. Das ganze soll beim auswählen von ähnlichen Fotografien dienen.

    Bei klick auf Button1 soll das bild1 aus der picturebox1 entfernt und von der Festplatte gelöscht werden.
    Bei klick auf button2 soll das bild2 aus der picturebox2 entfernt und von der Festplatte gelöscht werden.
    Bei Klick des 3. Buttons sollen beide Bilder beibehalten werden und neue, nach dem Zufallsprinzip geladen werden.

    Nachfolgend mein bisheriges "Ergebnis". Der Fehler (das programm "vergisst" vermutlich den Dateinamen "bild1" bzw. "bild2" des zufälligen Bildes) ist mir klar, dennoch bringe ich es ohne Hilfe nicht hin... Was funktioniert, ist die Anzeige der beiden Bildern.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Bilderliste As New List(Of String)(IO.Directory.GetFiles("laufwerk:\pfad\beispielfotos"))
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
    5. PictureBox2.SizeMode = PictureBoxSizeMode.Zoom
    6. Dim rnd As New Random
    7. Dim bild1 As String = Bilderliste(rnd.Next(0, Bilderliste.Count))
    8. Dim bild2 As String = Bilderliste(rnd.Next(0, Bilderliste.Count))
    9. PictureBox1.Load(bild1)
    10. PictureBox2.Load(bild2)
    11. End Sub
    12. Private Sub ButtonImage1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonImage1.Click
    13. My.Computer.FileSystem.DeleteFile("bild2", FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
    14. End Sub
    15. Private Sub ButtonImage2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonImage1.Click
    16. My.Computer.FileSystem.DeleteFile("bild1", FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin
    17. End Sub
    18. Private Sub ButtonBoth_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonBoth.Click
    19. End Sub
    20. End Class
    Variablen die in einem Sub deklariert sind, sind auch nur in diesem sichtbar. Deklariere sie außerhalb, damit sie klassenweit sichtbar werden.

    PS: Ist es erwünscht, dass evtl. zweimal das GLEICHE (nicht das selbe) Bild geladen wird? xDD
    Hier glaub die Lsg deiner Anforderung:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Bilderliste As New List(Of String)(IO.Directory.GetFiles("laufwerk:\pfad\beispielfotos"))
    3. Dim bild1 As String
    4. Dim bild2 As String
    5. Dim rnd As New Random
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
    8. PictureBox2.SizeMode = PictureBoxSizeMode.Zoom
    9. Load2Pics()
    10. End Sub
    11. Private Sub ButtonImage1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonImage1.Click
    12. My.Computer.FileSystem.DeleteFile(bild2, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
    13. End Sub
    14. Private Sub ButtonImage2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonImage1.Click
    15. My.Computer.FileSystem.DeleteFile(bild1, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin
    16. End Sub
    17. Private Sub ButtonBoth_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonBoth.Click
    18. Load2Pics()
    19. End Sub
    20. Private Sub Load2Pics()
    21. bild1 = Bilderliste(rnd.Next(0, Bilderliste.Count))
    22. bild2 = Bilderliste(rnd.Next(0, Bilderliste.Count))
    23. PictureBox1.Load(bild1)
    24. PictureBox2.Load(bild2)
    25. End Sub
    26. End Class

    naja - die Lsg besteht darin, bild1 und bild2 als KlassenVariable anzulegen, dann "vergisster" da auch nix. Und das Random muß auch Klassenvariable sein, denn wenn man immer ein neues erstellt, dann erhält man sicherlich keine ZufallszahlenFolge, denn das neue Random kennt ja nicht die vorherigen Zahlen.
    Dass man mit New immer ein neues Objekt erzeugt, ist dir bekannt?
    Also die Lösung von "ErfinderDesRades" hat mich weiter gebracht, danke!

    Allerdings wird nach dem löschen eines Bildes sofort auch gefragt, ob das andere Bild auch gelöscht werden soll. Anschließend stürzt VB ab.
    Ziel sollte es sein, dass er nach dem Betätigen des buttons wieder 2 neue Zufallsbilder aus dem Ordner lädt. Kannst du mir noch sagen, wie ich das richtig programmiere?
    Kannst du mir noch sagen, wie ich das richtig programmiere?
    nur sehr ungern, weil dann kann man nicht von "weitergebracht" sprechen, wenn du ohne jedes Verständnis dir einfach nur von extern Problemchen nach Problemchen lösen lässt.

    singapurtaucher schrieb:

    wieder 2 neue Zufallsbilder aus dem Ordner lädt.
    Das ist so einfach, also wenn du da nicht drauf kommst...
    Gugge meinen Code an, weil da ist die entsprechende Methode ja bereits enthalten, und muß nur aufgerufen werden.

    Wie man eine Methode aufruft ist dir bekannt?
    So,

    Ich weiß inzwischen dass man ein Modul mit "Sub" wählt, und bin in einen Schritt weiter.

    @Freak: zweimal das gleiche Bild sollte nicht geladen werden. Deshalb habe ich nun eine IF-Abfrage eingebaut.

    Der akutelle Quellcode lautet jetzt:

    VB.NET-Quellcode

    1. Public Class Form1
    2. 'Dim Bilderliste As New List(Of String)(IO.Directory.GetFiles("E:\neuejdownloads\ProjectX\beispielfotos"))
    3. Dim bild1 As String
    4. Dim bild2 As String
    5. Dim rnd As New Random
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
    8. PictureBox2.SizeMode = PictureBoxSizeMode.Zoom
    9. Load2Pics()
    10. End Sub
    11. Private Sub ButtonImage1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonImage1.Click
    12. My.Computer.FileSystem.DeleteFile(bild2, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
    13. Load2Pics()
    14. End Sub
    15. Private Sub ButtonImage2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonImage2.Click
    16. My.Computer.FileSystem.DeleteFile(bild1, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin)
    17. Load2Pics()
    18. End Sub
    19. Private Sub ButtonBoth_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonBoth.Click
    20. Load2Pics()
    21. End Sub
    22. Sub Load2Pics()
    23. Dim Bilderliste As New List(Of String)(IO.Directory.GetFiles("E:\neuejdownloads\ProjectX\beispielfotos"))
    24. bild1 = Bilderliste(rnd.Next(0, Bilderliste.Count))
    25. bild2 = Bilderliste(rnd.Next(0, Bilderliste.Count))
    26. If bild1 = bild2 Then
    27. Load2Pics()
    28. End If
    29. PictureBox1.Load(bild1)
    30. PictureBox2.Load(bild2)
    31. End Sub
    32. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „singapurtaucher“ ()

    Wenn Du 2 zufällig ausgewählte Bilder vergleichst und dann eines von ihnen löschst, kanst Du gewiss sein, dass Dir wertvolle Bilder verlorengehen.
    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!

    singapurtaucher schrieb:

    zweimal das gleiche Bild sollte nicht geladen werden. Deshalb habe ich nun eine IF-Abfrage eingebaut.

    Das wird glaub so nicht funktionieren - ist ein kleiner Fehler drin.

    Der Ansatz, dass die Methode sich selbst aufruft, ist in diesem Falle auch ziemlich exotisch.
    @ erfinderdesrades
    Ich sehe da keinen Fehler (?), nur die Gefahr einer Endlosschleife wenn es nur noch eine einzige Datei gibt ;)

    @ TE
    wie rodfromgermany schon sagte ist dein Vorgehen nicht optimal. Viel cooler wäre es doch, wenn dein Programm nur ähnliche Bilder auflistet und du wählen kannst, welche du behalten möchtest. Zum Thema Bitmap vergleichen gibt es hier mehr als genug, wichtig ist zuerst grob und ggf unabhängig von der Bildgröße zu prüfen...


    Lg
    @Freak: Du hast selbstverständlich recht, das Programm ist nicht optimal, da wenn überhaupt nur ähnliche Fotos verglichen werden können. Ich wollte einfach anhand eines einfachen Programms wieder in VB reinkommen, um mich dann zu steigern.