Anzeigen eines von einer Funktion generierten Bildes

  • WPF MVVM
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Anzeigen eines von einer Funktion generierten Bildes

    Hallo Community,

    da das Thema nun doch in eine etwas andere Richtung geht, mache ich hier mal einen neuen Thread auf.

    Es geht darum:

    Die bass.dll generiert per Funktion ein Bild mit folgender Funktion:

    VB.NET-Quellcode

    1. ​Public Function CreateSpectrumLinePeak (
    2. channel As Integer,
    3. width As Integer, 'für den Aufruf soll Breite As Double genommen werden
    4. height As Integer, 'für den Aufruf soll Hoehe As Double genommen werden
    5. color1 As Color,
    6. color2 As Color,
    7. color3 As Color,
    8. background As Color,
    9. linewidth As Integer,
    10. peakwidth As Integer,
    11. distance As Integer,
    12. peakdelay As Integer,
    13. linear As Boolean,
    14. fullSpectrum As Boolean,
    15. highQuality As Boolean
    16. ) As Bitmap


    oder alternativ die Überladung:

    VB.NET-Quellcode

    1. Public Function CreateSpectrumLinePeak (
    2. channel As Integer,
    3. g As Graphics, 'alternativ das hier
    4. clipRectangle As Rectangle, 'alternativ das hier
    5. color1 As Color,
    6. color2 As Color,
    7. color3 As Color,
    8. background As Color,
    9. linewidth As Integer,
    10. peakwidth As Integer,
    11. distance As Integer,
    12. peakdelay As Integer,
    13. linear As Boolean,
    14. fullSpectrum As Boolean,
    15. highQuality As Boolean
    16. ) As Boolean​


    Problem bei der ersten war, dass ich bei folgendem...

    XML-Quellcode

    1. <Image Width="{Binding Breite, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" Height="{Binding Hoehe, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" Source="{Binding Bild, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>


    ...für die Properties Breite und Hoehe, wenn ich sie an eine Klasseneigenschaft vom Typ Double gebunden hab, immer NaN als Wert erhalten hab.

    Also wenn mir irgendjemand sagen könnte, woran das liegt, würde ich mich sehr freuen.

    Alternativ würde evtl. auch die zweite Überladung funktionieren, aber keine Ahnung ob ich in der WPF irgendwie mit einem GDI+ Grafikobjekt arbeiten kann, oder ob es alternativ einen anderen Weg gibt.

    Freue mich auf eure Antworten,

    kafffee
    Hallo

    Ich bin etwas verwirrt. Die Funktion der Bass.dll hat ja mit dem Thema erstmal nix zu tun. das ​Image is ja auf was anderes gebunden.
    Wenn du NaN zurück bekommst musst du prüfen ob du deine Properties richtig setzt.

    Interessanter wäre wenn du das ViewModel Postest anstatt der Methode der bass.dll. Denn was ist denn die Eigenschaft ​Bild für ein Typ.
    Auf das ist ​Image ja gebunden. Wenn das von Typ ​Bitmap ist wäre das schon falsch da ​Image als Source ein Objekt von Typ ImageSource verlangt. Das musst du erstmal umwandeln.
    Also Poste mal die Klasse, wäre interessant wie du Hoehe und Breite überhaupt setzt und ob do es korrekt aus dem Bitmap holst.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23mnull
    OK mach ich. Bin heut bloss den ganzen Tag unterwegs ich meld mich dann noch mal...

    Edit:
    @Nofear23m

    VB.NET-Quellcode

    1. Public Class EQ1_2ViewModel
    2. Inherits ViewModel.Instrastructure.ViewModelBase
    3. Public WelcherEQ As Integer
    4. Public Spektrum As New Un4seen.Bass.Misc.Visuals
    5. Public BMP As Bitmap
    6. Public Sub New(_WelcherEQ As Integer)
    7. WelcherEQ = _WelcherEQ
    8. Spektrum.ChannelIsMixerSource = True
    9. MainModule.MeinEQ(WelcherEQ - 1) = New Equalizer(MainModule.streamfx(WelcherEQ - 1))
    10. MainModule.SpectrumAnalyzerBreite = 1
    11. MainModule.SpectrumAnalyzerDistanz = 0
    12. MainModule.VisualizationTimer.Interval = TimeSpan.FromMilliseconds(25)
    13. AddHandler MainModule.VisualizationTimer.Tick, AddressOf UpdateVisualization
    14. End Sub
    15. Private _Bild As ImageSource
    16. Public Property Bild As ImageSource
    17. Get
    18. Return _Bild
    19. End Get
    20. Set(value As ImageSource)
    21. _Bild = value
    22. RaisePropertyChanged()
    23. End Set
    24. End Property
    25. Private _Breite As Integer
    26. Public Property Breite As Integer
    27. Get
    28. Return _Breite
    29. End Get
    30. Set(value As Integer)
    31. _Breite = value
    32. RaisePropertyChanged()
    33. End Set
    34. End Property
    35. Private _Hoehe As Integer
    36. Public Property Hoehe As Integer
    37. Get
    38. Return _Hoehe
    39. End Get
    40. Set(value As Integer)
    41. _Hoehe = value
    42. RaisePropertyChanged()
    43. End Set
    44. End Property
    45. Private Sub UpdateVisualization(ByVal sender As Object, ByVal e As EventArgs)
    46. BMP = Spektrum.CreateSpectrumLinePeak(MainModule.streamfx(WelcherEQ - 1), Breite, Hoehe, System.Drawing.Color.Green, System.Drawing.Color.IndianRed, System.Drawing.Color.SlateGray, System.Drawing.Color.Transparent, MainModule.SpectrumAnalyzerBreite, 3, MainModule.SpectrumAnalyzerDistanz, 40, False, True, True)
    47. Bild = BitmapToImageSource(BMP)
    48. End Sub
    49. Private Function BitmapToImageSource(ByVal bitmap As Bitmap) As BitmapImage
    50. If bitmap IsNot Nothing Then
    51. Using memory As MemoryStream = New MemoryStream()
    52. bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp)
    53. memory.Position = 0
    54. Dim bitmapimage As BitmapImage = New BitmapImage()
    55. bitmapimage.BeginInit()
    56. bitmapimage.StreamSource = memory
    57. bitmapimage.CacheOption = BitmapCacheOption.OnLoad
    58. bitmapimage.EndInit()
    59. Return bitmapimage
    60. End Using
    61. End If
    62. End Function
    63. End Class


    Problem ist ja (wie in dem andern Thread wie Bitmap in WPF Image anzeigen), dass wenn ich Breite und Hoehe als Integer deklariere, um das erzeugte Bild ein roter Rahmen erscheint. Die Funktion der bass.dll will die Höhe und Breite des Image als Integer, damit das Bild korrekt erzeugt wird. Wenn ich aber die beiden als Double deklariere (so wie Image das haben will, damit kein roter Rand erscheint), dann werden Breite und Hoehe NaN. Meine Denke war die, dass ich HorizontalAlignment und VeritcalAlignment auf Stretch setze, und Breite und Hoehe mit OneWayToSource binde, damit das Image auf die richtige Grösse skaliert wird und dann die Funktion der bass.dll die richtigen Werte für Breite und Hoehe ausliest

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „kafffee“ ()