Image Dateinamen abrufen

  • WPF

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Picturebox5.

    Image Dateinamen abrufen

    Ich habe mir in xaml ein Image erstellt das ich in Codebehind per Zufall mit einem Bild fülle. Image.Source = New BitmapImage(New Uri("Bild.jpg", UriKind.Relative)).
    Nu möchte ich mit "If Image.Source = Bild so und so Then" was auslösen.

    wenn ich:

    VB.NET-Quellcode

    1. If image.Source = "Bild.jpg" Then
    2. machwas
    3. end if

    versuche, heißt es "Der Wert vom Typ "System.Windows.Media.ImageSource" kann nicht in "String" konvertiert werden".

    gibt es eine Möglichkeit den Dateinamen des geladenen Image zu Überprüfen?
    Wenn Source ein BitmapImage ist, dann caste dies zu BitmapImage und verwende die BaseUri-Property: msdn.microsoft.com/en-us/libra….imaging.bitmapimage.aspx
    Und bedenke: Option Strict On. Nur ein String kann mit einem String verglichen werden es sei denn es wurden Operatoren überladen. Aber das glaube ich weniger. Welchen Sinn soll es haben ein Bild als einen Text zu verwenden? Nicht alles sind Strings.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Genau.
    Die ImageSource weiß nichts vom Dateinamen des ursprünglichen Bildes, sie kennt lediglich die Pixelinformation, Wenn Du da einen Zusammenhang benötigst, musst Du ihn selbst programmieren.
    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!
    danke für euer schnelle Antwort.

    Artentus schrieb:

    Speicher dir bei dem Erstellen des Bildes den Dateinamen.

    wenn ich vorher wüsste was für ein Bild geladen wird wäre das kein Problem.

    thefiloe schrieb:

    Wenn Source ein BitmapImage ist, dann caste dies zu BitmapImage und verwende die BaseUri-Property: msdn.microsoft.com/en-us/library/…itmapimage.aspx
    Und bedenke: Option Strict On. Nur ein String kann mit einem String verglichen werden es sei denn es wurden Operatoren überladen. Aber das glaube ich weniger. Welchen Sinn soll es haben ein Bild als einen Text zu verwenden? Nicht alles sind Strings.

    Hm BaseUri sagt mir nix. Hab schon mal ein bischen gegoogelt aber nicht wirklich was gefunden bzw. kapiert ?( . Hast du vielleicht nen link oder Beispielcode zur Hand? Ach ja ich bin Programieranfänger, es wäre schön wenn eine erklärung dabei wäre.
    Mit der mdsn Seite komm ich noch nicht so wirklich klar. Es sei denn es sind für mich verständliche Codebeispiele dabei.
    Vielleicht steh ich jezte etwas auf der Leitung.
    Also der Index wird für den Array gewürfelt, dann ist es doch nicht möglich mir den zu merken. Oder doch....?

    Beispiel für Array. Ich fülle Array mit Insert. r_1 - r_4 wird mit Random ausgewürfelt und dann eingetragen.

    VB.NET-Quellcode

    1. stapel.Insert(r_1, "Bild1.jpg")
    2. stapel.Remove("")
    3. stapel.Insert(r_2, "Bild2.jpg")
    4. stapel.Remove("")
    5. stapel.Insert(r_3, "Bild3.jpg")
    6. stapel.Remove("")
    7. stapel.Insert(r_4, "Bild4.jpg")

    usw.

    Picturebox5 schrieb:

    Das ganze ist ein Kartenstapel.

    ich blick bei den Probleme nicht durch, aber wenn das ein Kartenspiel werden soll, dann brauchst du ein entsprechendes Datenmodell.
    Mit BitmapImages in ArrayLists im CodeBehind kann man da imo nicht durchkommen.

    Hast du mal was vom MVVM–Pattern (Josh Smiths Artikel) gehört?

    Picturebox5 schrieb:

    Hm BaseUri sagt mir nix. Hab schon mal ein bischen gegoogelt aber nicht wirklich was gefunden bzw. kapiert . Hast du vielleicht nen link oder Beispielcode zur Hand? Ach ja ich bin Programieranfänger, es wäre schön wenn eine erklärung dabei wäre.
    Mit der mdsn Seite komm ich noch nicht so wirklich klar. Es sei denn es sind für mich verständliche Codebeispiele dabei.
    Versteh ich nicht. Ich hab dir doch den Link gegeben. Unter Properties ist es die ERSTE Property: BaseUri. Mehr brauchste ja nicht.
    Wie es funktioniert hab ich dir ja schon gesagt. Wenn dein Bild vom Typ BitmapImage ist musst du dies zu einem BitmapImage casten. Anschließend kannste einfach die BaseUri verwenden.
    Eigentlich müsstest du das hinbekommen und msdn ist mit Abstand die beste Seite für solche Dinge.
    Hier haste nen kleines Beispiel(google nach nem konverter und konvertiers dir nach vb):

    Quellcode

    1. if(image.Source != null && image.Source is BitmapImage)
    2. {
    3. var bmp = image.Source as BitmapImage;
    4. System.Diagnostics.Debug.WriteLine(bmp.BaseUri.ToString());
    5. }


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    hi ErfinderDesRades, und danke das du dir mein Problem mal angeschaut hast, auch wenn du es nicht verstehst :) . Das ist nicht direkt ein Kartenspiel, es ist eher ein Brettspiel mit Karten.

    ErfinderDesRades schrieb:

    Hast du mal was vom MVVM–Pattern (Josh Smiths Artikel) gehört?
    Nein hab ich noch nicht, aber wenn ich mal Zeit habe, werde ich mir das mal anschauen.

    thefiloe schrieb:

    Versteh ich nicht. Ich hab dir doch den Link gegeben. Unter Properties ist es die ERSTE Property: BaseUri. Mehr brauchste ja nicht.
    Ja hast du :) . Aber ich Programiere erst seit ca. einem halben Jahr davon in der Woche vielleicht 5 Std. (ich wünschte ich hätte mehr Zeit ;) ), und versteh halt leider so gut wie garnix. Und die Seite ist bestimmt gut für jemanden der schon mal die Grundkentnisse kennt, wovon ich noch weit entfernt bin denke ich.

    Mit dem Code von dir komm ich nicht ganz dahin wo ich hin will. Vielleicht hab ich mich falsch ausgedrückt, ich möchte das etwas Passiert wenn ein bestimmtes Bild in Image.Source geladen ist.
    Also:
    if image.source = bestimmtesbild.jpg then
    machwas
    end if
    ich hab mal versucht das Bild ohne abfrage zu casten:

    VB.NET-Quellcode

    1. Dim o12 As New BitmapImage(New Uri("o12DM.jpg", UriKind.Relative))
    2. Dim bmp = TryCast(o12, BitmapImage)
    3. System.Diagnostics.Debug.WriteLine(bmp.BaseUri.ToString())
    4. If g1.Source Is bmp Then
    5. sks1.Visibility = Visibility.Visible
    6. End If
    7. End If

    aber das scheint nicht der richtige Weg zu sein.
    Also wenn dir fehlen nicht nur Grundlagen sondern die Grundlagen der Grundlagen. Tipp: Alles wegwerfen und erstmal Grundlagen lernen. Da gibts nix mit Bildern usw. Die ganzen Bilder,... sind alles Klassen, Eigenschaften, Methoden,... solange du nicht weißt was das Zeug ist wird das nix.
    Außerdem hast du meinen Code nicht wirklich verwendet:

    VB.NET-Quellcode

    1. Dim bmp = TryCast(image.Source, BitmapImage)
    2. If bmp <> Nothing AndAlso bmp.BaseUri.LocalPath = "tmp.jpg" Then
    3. 'mach dein zeug
    4. End If


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    thefiloe schrieb:

    Außerdem hast du meinen Code nicht wirklich verwendet:
    Ich hab deinen Code verwendet. Der hat auch super funktioniert. Er hat das Event aber nicht bei einem bestimmten Bild ausgelöst, sondern bei allen Bildern. Deswegen habe ich versucht den Code abzuändern.

    thefiloe schrieb:

    Also wenn dir fehlen nicht nur Grundlagen sondern die Grundlagen der Grundlagen.
    Naja ich kenn schon Klassen, Eigenschaften, Methoden (natürlich bei weitem noch nicht alle). Ich weiß halt nur noch nicht so gut wie und wann man die anwendet, verändert, erstellen kann bzw. sollte. Aber dafür habe ich mich ja hier angemeldet in der Hoffnung das mir hier geholfen wird.
    Klar ich kann mir auch noch ein paar Bücher kaufen in dem dann eventuell wieder mal nicht drinnen steht was ich brauche. Was aber nicht heißen soll das ich mir keine Bücher mehr kaufe, bei mir ist es nur im Sommer etwas schlecht mit dem Bücher wälzen wegen Saisonarbeit. Außerdem wäre das schöne Forum hier für die Katz.
    Aber genug geplaudert.

    mit

    VB.NET-Quellcode

    1. Dim bmp = TryCast(image.Source, BitmapImage)
    2. If bmp <> Nothing AndAlso bmp.BaseUri.LocalPath = "tmp.jpg" Then
    3. 'mach dein zeug
    4. End If

    heißt es: Der <>- Operator ist für die Typen "System.Windows.Media.Imaging.BitmapImage " und " System.Windows.Media.Imaging.Bitmapimage" nicht definiert.

    VB.NET-Quellcode

    1. Dim bmp = TryCast(image.Source, BitmapImage)
    2. If bmp IsNot Nothing AndAlso bmp.BaseUri.LocalPath = "tmp.jpg" Then
    3. 'mach dein zeug
    4. End If

    geht auch nicht. Der Code läuft zwar ohne Fehler durch, aber es passiert auch nichts.
    Sorry war mein Fehler. Ich programmiere seit Jahre nicht mehr in VB. Habe einfach != mit <> übersetzt :rolleyes:
    Du hast das tmp.jpg aber schon angepasst. Ansonsten musst du jetzt halt mal Eigeninitiative zeigen und mal nen Debugger verwenden. Code der gleich funktioniert schreibt praktisch niemand. Mach nen Breakpoint bei der If und schau was bmp.BaseUri bzw. LocalPath der BaseUri für einen Wert hat.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    thefiloe schrieb:

    Ich programmiere seit Jahre nicht mehr in VB. Habe einfach != mit <> übersetzt :rolleyes:

    glaub ich dir Gerne. :)
    Ja das tmp.jpg hab ich angepasst zu "o12DM.jpg", was passieren soll hab ich auch eingetragen.
    Der LocalPath verwirrt mich etwas weil es da heißt: "Ruft die Darstellung eines Dateinamens im lokalen Betriebssystem ab". Meine Bilder sind alle im Projektmappen-Explorer gespeichert. Kann es damit was zu tun haben?
    Nach dem Break habe ich folgendes Ergebnis bekommen.
    bmp.BaseUri.LocalPath = "/WPF Projekt;component/mainwindow.xaml"

    hier nochmal der veränderte Code:

    VB.NET-Quellcode

    1. Dim bmp = TryCast(gs1.Source, BitmapImage)
    2. If bmp IsNot Nothing AndAlso bmp.BaseUri.LocalPath = "o12DM.jpg" Then
    3. sks1.Visibility = Visibility.Visible
    4. End If
    Hallo,

    ich hab jetzt nicht den ganzen Thread gelesen, aber ich würde das mit einer Property machen.

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. Title="MainWindow" Height="350" Width="525">
    5. <Grid>
    6. <Image x:Name="img" Source="{x:Null}"></Image>
    7. <Button Content="Click Me" Margin="0,293,418,0" Name="Button1" />
    8. </Grid>
    9. </Window>

    VB.NET-Quellcode

    1. Class MainWindow
    2. Private img_uri As String
    3. Private Property Image_Uri As String
    4. Get
    5. Return img_uri
    6. End Get
    7. Set(ByVal value As String)
    8. img_uri = value
    9. img.Source = New BitmapImage(New Uri(img_uri))
    10. End Set
    11. End Property
    12. Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    13. Image_Uri = "C:\1.jpg"
    14. End Sub
    15. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    16. If Image_Uri = "C:\1.jpg" Then
    17. MessageBox.Show(Image_Uri)
    18. End If
    19. End Sub
    20. End Class


    mfG

    Derfuhr

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

    Herzlichen dank an alle.
    Derfur dein Code hat mir zwar ganz schön Nerfen gekostet :D . Ich dachte schon ich muss mein ganzes Projekt umschreiben, hab aber doch noch eine Lücke im Code endeckt wo ich die Property einsetzen konnte.
    Ich danke dir für den schups in die richtige Richtung. Dein Code arbeitet Perfekt :thumbsup: .

    Der schlüssel war dann:

    XML-Quellcode

    1. <Image x:Name="gsued1" Stretch="Fill" />


    VB.NET-Quellcode

    1. 'Dein Code abgeändert
    2. Private gsued1_uri As String
    3. Private Property Sued1_Uri As String
    4. Get
    5. Return gsued1_uri
    6. End Get
    7. Set(ByVal value As String)
    8. gsued1_uri = value
    9. gsued1.Source = New BitmapImage(New Uri(gsued1_uri))
    10. End Set
    11. End Property
    12. Private Sub gsued1_MouseDown(sender As Object, e As MouseButtonEventArgs)
    13. If gsued1.Source Is Nothing Then
    14. gsued1.Source = speicher.Source
    15. speicher.Source = Nothing
    16. speicher.Visibility = Visibility.Hidden
    17. 'die gesagte Lücke :)
    18. Sued1_Uri = gsued1.Source.ToString
    19. If Sued1_Uri = "pack://application:,,,/WPF myprojekt;component/o12DM.jpg" Then
    20. sks1.Visibility = Visibility.Visible
    21. End if
    22. End Sub


    thefiloe danke nochmal für deine Ausdauer und Gedult. Bindings.....da hab ich mal was gelesen, da muss ich nochmal nachschlagen.

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