wie Bitmap in WPF Image anzeigen

  • WPF

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    wie Bitmap in WPF Image anzeigen

    Hi.
    Ich erzeuge mit QRCoder in VB.NET eine Bitmap. Diese wird nicht extern gespeichert. Wie kann ich nun diese im WPF Image anzeigen?

    Quellcode

    1. Image_1.Source = New Uri(MeinImage, UriKind.Absolute)

    funzt nicht. Uri wird als Fehler "(veraltet) Sub Uri New..." makiert.

    MfG
    Hallo

    Da Source eine ImageSource erwartet musst du auch etwas passendes übergeben.

    VB.NET-Quellcode

    1. ​Image_1.Source = New BitmapImage(New Uri("http://...."))


    Grüße
    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. ##

    @NoFear23
    OK. Hab auch schonmal kurz in dein Tuto reingeschaut.
    Ich habe bisher nur mit WinForms gearbeitet. Da es aber in letzter Zeit immer wieder Probleme mit immer weiter verbreiteten
    hochauflösenden Monitoren und Darstellungsproblemen gibt möchte ich mich mal mit WPF beschäftigen und versuche
    vorhandene Anwendungen auf dieses Framework zu transformieren.
    Du siehst ja sicher schon an der Frage , dass das ein Anfängerproblem ist.
    Bilder aus einer externen Quelle einzubinden ist mir auch schon gelungen. Ich möchte den erzeugten QR-Code aber nicht erst speichern
    sondern direkt zur anzeige bringen. Wie sieht den da die Uri aus ?

    MfG

    doLob schrieb:

    Wie sieht den da die Uri aus ?

    Genau so wie ich es dir gepostet habe. Deshalb auch das http im String.

    Einfacher ist es wenn man wie es sich in der Welt der WPF gehört mit Binding arbeitet, da kannste dann direkt auf die URL als String binden.

    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. ##

    Ich weis ja nicht in welchem Format dein Bild ist aber folgendes klappt wunderbar.

    VB.NET-Quellcode

    1. ​img.Source = New BitmapImage(New Uri("https://www.vb-paradise.de/wcf/images/avatars/01/3128-0124b76125128a33003a968a4d2882f1479dd93f.jpg"))


    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. ##

    Ja, das funzt bei mir auch wunderbar.
    Der QR-Code wird als bitmap grafik erzeugt und befindet sich in einer Variablen die keine Endung hat oder as String vorliegt.

    Quellcode

    1. Dim MeinImage As Image

    In vb.net hatte ich diese einfach an eine PictureBox übergeben.

    Quellcode

    1. PictureBox1.Image = MeinImage


    Gruß

    doLob schrieb:

    Der QR-Code wird als bitmap grafik erzeugt

    Ahaaaa, da siehste mal wie wichtig es im Forum ist immer genug Information zu geben.
    Laut deinem ersten Post kommt man auf keinen anderen Gedanken als das du ein Bild aus einer URI laden willst.


    OK, dann hätte ich da folgende Methode:

    VB.NET-Quellcode

    1. Private Function BitmapToImageSource(ByVal bitmap As Bitmap) As BitmapImage
    2. Using memory As MemoryStream = New MemoryStream()
    3. bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp)
    4. memory.Position = 0
    5. Dim bitmapimage As BitmapImage = New BitmapImage()
    6. bitmapimage.BeginInit()
    7. bitmapimage.StreamSource = memory
    8. bitmapimage.CacheOption = BitmapCacheOption.OnLoad
    9. bitmapimage.EndInit()
    10. Return bitmapimage
    11. End Using
    12. End Function


    Grüße
    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. ##

    Gerne. Sei so gut und markiere den Thread oben als Erledigt, so wissen andere das es hier eine Lösung gibt/gab.

    Grüße
    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. ##

    @Nofear23m

    Hey Sascha, ich hab deinen Code aus Post 8 grad mal in mein MVVM-Testprojekt integriert und es funktioniert so weit ganz gut.

    Nur eins wundert mich ein bisschen:

    Ich gebe das erzeugte Bild in einem Image aus. Wenn ich dem Image feste Werte für Width und Height gebe dann ist alles gut. Nur wenn ich das per Binding erledige, dann entsteht um das Bild rum ein roter Rand mit sagen wir mal 1-2 Pixeln Thickness... Ich glaube nicht dass das mit deinem Code zusammenhängt, kann es aber nicht mit Sicherheit sagen...
    Wenn ich meinen Code in einem WinForms-Programm kopiere und das dann direkt in einer PictureBox ausgebe, ist auch kein Problem...

    Ist das ein bekanntes und/oder lösbares Problem? Hier mal mein ViewModel:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Drawing
    3. Imports System.IO
    4. Imports System.Windows.Input
    5. Imports System.Windows.Media
    6. Imports System.Windows.Media.Imaging
    7. Imports System.Windows.Threading
    8. Imports Un4seen
    9. Imports Un4seen.Bass
    10. Public Class MainViewModel
    11. Inherits ViewModel.Instrastructure.ViewModelBase
    12. Public Spektrum As New Un4seen.Bass.Misc.Visuals
    13. Public streamfx As Integer
    14. Public VisualizationTimer As New DispatcherTimer
    15. Public BMP As Bitmap
    16. Public Sub New()
    17. If IsInDesignMode = False Then
    18. cbxIndex = 0
    19. Aufloesung = 1
    20. Distanz = 0
    21. Debug.WriteLine("Gestartet")
    22. _Hoehe = 100
    23. _Breite = 350
    24. VisualizationTimer.Interval = TimeSpan.FromMilliseconds(25)
    25. AddHandler VisualizationTimer.Tick, AddressOf UpdateVisualization
    26. Bass.BASS_Init(-1, 44100, BASSInit.BASS_DEVICE_CPSPEAKERS, IntPtr.Zero, Nothing)
    27. streamfx = Bass.BASS_StreamCreateFile("C:\Test.mp3", 0, 0, BASSFlag.BASS_STREAM_AUTOFREE Or BASSFlag.BASS_STREAM_PRESCAN)
    28. Bass.BASS_ChannelPlay(streamfx, False)
    29. VisualizationTimer.Start()
    30. End If
    31. End Sub
    32. Private _cbxIndex As Integer
    33. Public Property cbxIndex As Integer
    34. Get
    35. Return _cbxIndex
    36. End Get
    37. Set(value As Integer)
    38. _cbxIndex = value
    39. RaisePropertyChanged()
    40. End Set
    41. End Property
    42. Private Sub UpdateVisualization(ByVal sender As Object, ByVal e As EventArgs)
    43. Select Case cbxIndex
    44. Case 0
    45. BMP = Spektrum.CreateSpectrumLine(streamfx, Breite, Hoehe, System.Drawing.Color.Green, System.Drawing.Color.IndianRed, System.Drawing.Color.Black, 40, 5, False, True, True)
    46. Case 1
    47. BMP = Spektrum.CreateSpectrumBean(streamfx, Breite, Hoehe, System.Drawing.Color.Green, System.Drawing.Color.IndianRed, System.Drawing.Color.Black, 40, False, True, True)
    48. Case 2
    49. BMP = Spektrum.CreateSpectrumDot(streamfx, Breite, Hoehe, System.Drawing.Color.Green, System.Drawing.Color.IndianRed, System.Drawing.Color.Black, 40, 5, False, True, True)
    50. Case 3
    51. BMP = Spektrum.CreateSpectrumEllipse(streamfx, Breite, Hoehe, System.Drawing.Color.Green, System.Drawing.Color.IndianRed, System.Drawing.Color.Black, 40, 5, False, True, True)
    52. Case 4
    53. BMP = Spektrum.CreateSpectrumLinePeak(streamfx, Breite, Hoehe, System.Drawing.Color.Green, System.Drawing.Color.IndianRed, System.Drawing.Color.SlateGray, System.Drawing.Color.Black, Aufloesung, 3, Distanz, 40, False, True, True) 'DAS HIER IST PERFEKT!!
    54. Case 5
    55. BMP = Spektrum.CreateSpectrum(streamfx, Breite, Hoehe, System.Drawing.Color.Green, System.Drawing.Color.IndianRed, System.Drawing.Color.Black, False, True, True)
    56. Case 6
    57. BMP = Spektrum.CreateSpectrumText(streamfx, Breite, Hoehe, System.Drawing.Color.Green, System.Drawing.Color.IndianRed, System.Drawing.Color.Black, "Hallo Welt", False, True, True)
    58. Case 7
    59. BMP = Spektrum.CreateSpectrumWave(streamfx, Breite, Hoehe, System.Drawing.Color.Green, System.Drawing.Color.IndianRed, System.Drawing.Color.Black, Aufloesung, False, True, True)
    60. Case 8
    61. BMP = Spektrum.CreateWaveForm(streamfx, Breite, Hoehe, System.Drawing.Color.Green, System.Drawing.Color.IndianRed, System.Drawing.Color.Purple, System.Drawing.Color.Black, Aufloesung, True, False, True)
    62. End Select
    63. Bild = BitmapToImageSource(BMP)
    64. End Sub
    65. Private _StoppeVisualisierung As ICommand
    66. Public ReadOnly Property StoppeVisualisierung() As ICommand
    67. Get
    68. If _StoppeVisualisierung Is Nothing Then _StoppeVisualisierung = New Instrastructure.RelayCommand(AddressOf StoppeVisualisierung_Execute, Function(o) True)
    69. Return _StoppeVisualisierung
    70. End Get
    71. End Property
    72. Private Sub StoppeVisualisierung_Execute(obj As Object)
    73. VisualizationTimer.Stop()
    74. End Sub
    75. Private Function BitmapToImageSource(ByVal bitmap As Bitmap) As BitmapImage
    76. Using memory As MemoryStream = New MemoryStream()
    77. bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp)
    78. memory.Position = 0
    79. Dim bitmapimage As BitmapImage = New BitmapImage()
    80. bitmapimage.BeginInit()
    81. bitmapimage.StreamSource = memory
    82. bitmapimage.CacheOption = BitmapCacheOption.OnLoad
    83. bitmapimage.EndInit()
    84. Return bitmapimage
    85. End Using
    86. End Function
    87. Private _Bild As ImageSource
    88. Public Property Bild As ImageSource
    89. Get
    90. Return _Bild
    91. End Get
    92. Set(value As ImageSource)
    93. _Bild = value
    94. RaisePropertyChanged()
    95. End Set
    96. End Property
    97. Private _Breite As Integer
    98. Public Property Breite As Integer
    99. Get
    100. Return _Breite
    101. End Get
    102. Set(value As Integer)
    103. _Breite = value
    104. RaisePropertyChanged()
    105. End Set
    106. End Property
    107. Private _Hoehe As Integer
    108. Public Property Hoehe As Integer
    109. Get
    110. Return _Hoehe
    111. End Get
    112. Set(value As Integer)
    113. _Hoehe = value
    114. RaisePropertyChanged()
    115. End Set
    116. End Property
    117. Private _Aufloesung As Integer
    118. Public Property Aufloesung As Integer
    119. Get
    120. Return _Aufloesung
    121. End Get
    122. Set(value As Integer)
    123. _Aufloesung = value
    124. RaisePropertyChanged()
    125. End Set
    126. End Property
    127. Private _Distanz As Integer
    128. Public Property Distanz As Integer
    129. Get
    130. Return _Distanz
    131. End Get
    132. Set(value As Integer)
    133. _Distanz = value
    134. RaisePropertyChanged()
    135. End Set
    136. End Property
    137. End Class


    Und der XAML:

    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}"/>


    Die Application.xaml ist leer, es gibt nur diesen einen XAML und dieses ViewModel.

    Leider ist das Projekt wieder abhängig von der bass(net).dll..., die in dieser aktuellen Version leider auch nicht als NuGet erhältlich ist...

    Wäre cool wenn du was dazu sagen könntest...
    Hallo

    kafffee schrieb:

    dann entsteht um das Bild rum ein roter Rand

    Dann wirst du irgendwo einen Border oder ähnliches definiert haben.

    Wie schon in anderen Threads angesprochen bei solchen Fehlern immer erstmal in einem "frischen" Projekt probieren und sehen was hier passiert. Ja, das ist das Leben eines Entwicklers. Auch wenns weh tut ;)
    Nur mit dem bischen XAML kann ich leider nicht sagen was hier die Ursache ist.

    Da musste etwas mehr zeigen.

    Das mit der bass.dll ist blöd und erschwert das "helfen" am "echten" Projekt natürlich. Es gebe nur eine Restmöglichkeit. Wir schaun uns das per Discord an und schreiben hier dann die Lösung nieder (so das es nachvollzogen werden kann).

    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. ##

    @Nofear23m

    Hey Sascha, freut mich mal wieder was von dir zu hören :)

    Hab mal ein kleines Testprogramm erstellt um der Sache mal näher zu kommen. Das Ganze lässt sich wie ich herausgefunden hab auch ohne bass.dll reproduzieren.

    In Zeile 18 im MainViewModel musst du halt noch den Pfad einer Bilddatei angeben.

    Problem ist wie gesagt der rote Rand, der aber nur auftritt, wenn ich Width und Height des Image jeweils auf eine Klasseneigenschaft binde...

    Auf Discord chatten können wir trotzdem noch, sag mir wann und ich schau dass ich mir da Zeit nehmen kann und mich gut vorbereite... :)
    Dateien
    Wenn jetzt noch das Bild dabei wäre welches du benutzt hast wäre das ganze sogar lauffähig.
    C:\Users\alpha\Pictures\DSC_0214.JPG gibt es bei mir nämlich nicht. ;)
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Ok schau dir mal den Datentyp deiner Propertys Hoehe und Breite an. Der Datentyp von Hoehe und Breite bei einem Image ist eine anderer. Siehe Objektbrowser.
    Dann verschwindet auch der rote Rand.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Aahhh jetzt ja. Hab mir sowas in der Art schon gedacht.... Kam auf die Idee, als ich mal an die Text-Property einer Textbox eine Integer Eigenschaft gebunden hab und dann auch ein roter Rand erschien, wenn keine Ganzzahl eingegeben wurde. Hatte den Gedanken dann wieder verworfen weil ich mir dachte, dass ein Pixel ein Pixel ist und nur somit nur eine Ganzzahl sein kann... Jetzt seh ich grad, dass das nicht in Pixel definiert wird sondern in geräteunabhängigen Einheiten.... Danke dir :)
    Genau, wie Akanel schon schrieb ist immer auf den Datentyp zu achten, ansonsten müsste man eben einen Converter zwischenschalten.

    Gut das du das Thema erledigen konntest.

    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. ##

    Jetzt muss ich unerwarteterweise doch noch mal nachhaken:

    Problem ist, dass die Funktion, die mein Bild "erstellt", jeweils einen Integer für Breite und Höhe will, also habs ichs versucht einfach zu konvertieren:

    Convert.ToInt32() --> System.OverflowException: Der Wert für einen Int32 war zu groß oder zu klein.
    CInt()--> System.OverflowException: Die arithmetische Operation hat einen Überlauf verursacht.
    DirectCast() --> Der Wert vom Typ Double kann nicht in Integer konvertiert werden
    CType() --> System.OverflowException: Die arithmetische Operation hat einen Überlauf verursacht.

    Auch vorher auf Ganzzahl auf bzw. abrunden hab ich versucht, ebenfalls ohne Erfolg.

    Also hab ich einen Haltepunkt gesetzt, und bin mit der Maus mal über Breite/Hoehe gefahren. Der Wert von beiden ist NaN, was laut Google "Not a Number" heisst. Aber wies not a number, ich habe die Properties doch als Double deklariert???