tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Norbert Eder
ERLEDIGT
NEIN
ANTWORTEN
14
ZUGRIFFE
4026
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Andy0709 Andy0709 ist offline Mitglied Bronze
    Registriert seit
    Apr 2008
    Beiträge
    26
    Hy

    wie kann ich ein byte[] zu einem WPF Image konvertieren?

    hab eine datei als byte[] von einem Webserver heruntergeladen und möchte nun ein Image daraus machen. Im normalen C# würde es image.fromStream geben, in WPF ist diese Methode jedoch nicht vorhanden, gibt es eine Alternative
     

  2. #2
    engelmarkus engelmarkus ist offline Mitglied Brokat
    Registriert seit
    Sep 2007
    Beiträge
    473
    Das FromStream() gibts schon noch, nur is halt keine using-Direktive da, d.h. du musst es so verwenden:

    Code :
    1
    
    System.Drawing.Image img = System.Drawing.Image.FromStream(...);

    Dann musst du es noch in ein System.Windows.Controls.Image umwandeln.
     

  3. #3
    Andy0709 Andy0709 ist offline Mitglied Bronze
    Registriert seit
    Apr 2008
    Beiträge
    26
    thx werds versuchen und mich dann melden
     

  4. #4
    Andy0709 Andy0709 ist offline Mitglied Bronze
    Registriert seit
    Apr 2008
    Beiträge
    26
    wie kann ich ein normlaes Image zu einem WPF-Image konvertieren

    ich downloae ein png Image mittels webclient.downloadFileAsync("adresse", "byte[]");

    im eventhandler(FileDownloadCompleted()) wandle ich das byte[] zu einem System.Drawing.Image um, wie kann ich dieses Imaga auf einem Canvas anzeigen bzw. in ein WPF-Image umwandeln
     

  5. #5
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Code :
    1
    2
    3
    4
    5
    
    BitmapImage bi = new BitmapImage();
    bi.BeginInit();
    bi.StreamSource = File.OpenRead(@"C:\Users\Public\Pictures\Sample Pictures\Garden.jpg");
    bi.EndInit();
    this.MainImage.Source = bi;
    Das ist die eine Variante. D.h. du arbeitest direkt mit einem Stream.

    Eine weitere Variante wäre, ein Objekt vom Typ BitmapSource zu erstellen. Dem kannst du im Konstruktor ein byte[] mitgeben. Die BitmapSource bindest du dann an die Eigenschaft Source deines Image-Elements.
     

  6. #6
    Andy0709 Andy0709 ist offline Mitglied Bronze
    Registriert seit
    Apr 2008
    Beiträge
    26
    Ich denke die letzte von dir aufgezeigte moeglichkeit ist das was wir suchen, da ich ja keinen direkten Festplattenzugriff wie File.OpenRead(@"C:\Users\Public\Pictures\Sample Pictures\Garden.jpg"); verwenden will.

    Was mir allerdings ein rätsel ist, wie gebe ich der BitmapSource mein byte array mit?
    was mir bisher vorschwebt:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    void treeview_item_MouseDown(object sender, MouseButtonEventArgs e)
            {
                bildname = @"C:\"+((TreeViewItem)sender).Header.ToString();
                wc = new WebClient();
                wc.DownloadDataCompleted += new DownloadDataCompletedEventHandler(wc_DownloadDataCompleted);
                wc.DownloadDataAsync(new Uri(((TreeViewItem)sender).Tag.ToString()));
            }
     
            void wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
            { //Zuweisung des Byte[] meinem Image namens helpimage}


    hättest du dafuer vll ein codebeispiel?
     

  7. #7
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Zitat Zitat von Andy0709 Beitrag anzeigen
    Ich denke die letzte von dir aufgezeigte moeglichkeit ist das was wir suchen, da ich ja keinen direkten Festplattenzugriff wie File.OpenRead(@"C:\Users\Public\Pictures\Sample Pictures\Garden.jpg"); verwenden will.
    Was ich im Satz nach meinem Beispiel angesprochen habe, hier noch einmal deutlicher: File.OpenRead steht für einen Stream. D.h. du kannst hier jeden Stream der ein Byte-Array zurückgibt verwenden.

    Zitat Zitat von Andy0709 Beitrag anzeigen
    Was mir allerdings ein rätsel ist, wie gebe ich der BitmapSource mein byte array mit?
    Einfach mal in die MSDN gucken:
    BitmapSource Class (erstes Beispiel).
     

  8. #8
    Andy0709 Andy0709 ist offline Mitglied Bronze
    Registriert seit
    Apr 2008
    Beiträge
    26
    hab jetzt fuer nen moment gedacht ich weiss was du meinst, dann is folgendes raus gekommen, was nicht geht weil ich keine uri mit geben darf.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    void treeview_item_MouseDown(object sender, MouseButtonEventArgs e)
            {
                bi = new BitmapImage();
                bi.BeginInit();
                bi.DownloadCompleted += new EventHandler(bi_DownloadCompleted);
                bi.StreamSource = File.OpenRead("http://www.helmut-kauer.de/Hundesalon/Hund1n.jpg");
                bi.EndInit();
             }
     
            void bi_DownloadCompleted(object sender, EventArgs e)
            {
                helpimage.Source = bi;
            }


    ich steh wohl auf der l eitung
    Geändert von Andy0709 (29.04.08 um 19:19 Uhr)
     

  9. #9
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Öhm, folgendes:
    Du hattest ja schon eine Methode, dir die Grafik herunter zu laden und in einem Byte-Array zu halten. Lass das doch gleich und Verwende das Beispiel aus dem MSDN-LINK den ich dir gepostet habe. Das sollte dann doch so reichen.
     

  10. #10
    Andy0709 Andy0709 ist offline Mitglied Bronze
    Registriert seit
    Apr 2008
    Beiträge
    26
    Code :
    1
    
    BitmapSource bitmap = BitmapSource.Create(width, height, 96, 96, pf, null,byte[], rawStride);


    mein problem hierbei ist ich weiss nicht wo ich die anderen parameter die ich dem constructor mitgeben muss her bekomme (mein image soll noch in original groesse etc angezeigt werden)



    [EDIT]:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
            void treeview_item_MouseDown(object sender, MouseButtonEventArgs e)
            {
                bildname = @"C:\"+((TreeViewItem)sender).Header.ToString();
                wc = new WebClient();
                wc.DownloadDataCompleted += new DownloadDataCompletedEventHandler(wc_DownloadDataCompleted);
                wc.DownloadDataAsync(new Uri(((TreeViewItem)sender).Tag.ToString()));
            }
     
            void wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
            {
                PixelFormat p = PixelFormats.Bgr32;
                
                BitmapSource btm = BitmapSource.Create(1,1,1,1,p,null, e.Result,1);
                helpimage.Source = btm;

    so hät ich das jetzt mal versucht, leider erfolglos, bin bissl verwirrt.
    im treeviewitem.tag steht:
    http://htl2k4.ht.funpic.de/wbblite/i.../avatar-53.jpg
    drin.
    Geändert von Andy0709 (29.04.08 um 21:03 Uhr)
     

  11. #11
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Na dann. Gegeben ist folgende XAML-Datei:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    <Window x:Class="WpfImageFromByteArrayDemo.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
        <Grid>
            <Image x:Name="ImageViewer"/>
        </Grid>
    </Window>

    Die Codebehind-Datei sieht folgendermaßen aus:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.IO;
     
    namespace WpfImageFromByteArrayDemo
    {
        /// <summary>
        /// Interaktionslogik für Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            private const String IMAGEPATH = @"C:\Users\Public\Pictures\Sample Pictures\Garden.jpg";
     
            public Window1()
            {
                InitializeComponent();
     
                HandleImage(IMAGEPATH, this.ImageViewer);
            }
     
            private void HandleImage(String imagePath, Image image)
            {
                byte[] imageByteArray = GetImage(imagePath);
     
                MemoryStream ms = new MemoryStream(imageByteArray);
                BitmapDecoder bDecoder = BitmapDecoder.Create(ms, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);
                
                if (bDecoder != null && bDecoder.Frames.Count > 0)
                    image.Source = bDecoder.Frames[0];
            }
     
            private byte[] GetImage(String imagePath)
            {
                return File.ReadAllBytes(imagePath);
            }
        }
    }
    Damit wird das angegebene Image eingelesen (in meinem Fall von einem File, du liest das ja aus dem Web ein und hast dann ebenfalls wie ich, ein Byte-Array zur Verfügung).

    Anschließend wird über einen BitmapDecoder das Image geladen.
    Andy0709 bedankt sich. 

  12. #12
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Noch ein Hinweis: Dem BitmapDecoder.Create kannst du als ersten Parameter ein Uri-Objekt übergeben. Gib da mal deine URL an Damit reduziert sich der Code etwas:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.IO;
     
    namespace WpfImageFromByteArrayDemo
    {
        /// <summary>
        /// Interaktionslogik für Window1.xaml
        /// </summary>
        public partial class Window1 : Window
        {
            
     
            public Window1()
            {
                InitializeComponent();
     
                HandleImage(this.ImageViewer);
            }
     
            private void HandleImage(Image image)
            {
                BitmapDecoder bDecoder = BitmapDecoder.Create(new Uri("http://dotnet-gui.com/themes/default/images/common/logo_dotnet_gui.gif"), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);
     
                if (bDecoder != null && bDecoder.Frames.Count > 0)
                    image.Source = bDecoder.Frames[0];
            }
        }
    }
     

  13. #13
    Andy0709 Andy0709 ist offline Mitglied Bronze
    Registriert seit
    Apr 2008
    Beiträge
    26
    spitze, denke so sollte es funktionieren.

    vielen dank fuer deine hilfe, jetzt hab ich es verstanden !


    EDIT:

    Problem dank dir gelöst, big thx!
    Geändert von Andy0709 (30.04.08 um 16:04 Uhr)
     

  14. #14
    Andy0709 Andy0709 ist offline Mitglied Bronze
    Registriert seit
    Apr 2008
    Beiträge
    26
    es hat sich ein neues problem aufgetan, hab es nun so geloest:

    Code :
    1
    2
    3
    4
    5
    6
    
    void treeview_item_MouseDown(object sender, MouseButtonEventArgs e)
            {
                bDecoder = BitmapDecoder.Create(new Uri(((TreeViewItem)sender).Tag.ToString()), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);
                bDecoder.DownloadCompleted += new EventHandler(bDecoder_DownloadCompleted);
                bDecoder.DownloadProgress += new EventHandler<DownloadProgressEventArgs>(bDecoder_DownloadProgress);
            }


    geht auch, allerdings wird das downloaded event nie zweimal fuer das selbe bild geworfen.
    also wenn ich zweimal das selbe bild downloaden will geht er nur einmal in den downloaded bzw progress eventhandler.

    gibts dafuer ne loesung?




    [EDIT]:

    problem umgangen, loesung nicht mehr notwendig!
    Geändert von Andy0709 (01.05.08 um 11:14 Uhr)
     

  15. #15
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Hmm .. und wenn sich das gleiche Bild inzwischen am Server ändert funktioniert es auch nicht?
     

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 22.02.10, 12:05
  2. Convert ImageIcon/ Image/ Graphics2D To Byte Array
    Von nathaniells freak im Forum Java
    Antworten: 2
    Letzter Beitrag: 12.03.09, 23:04
  3. Image in ein byte array schreiben
    Von MCH im Forum Java
    Antworten: 1
    Letzter Beitrag: 30.06.08, 07:08
  4. java.awt.Image >> byte[] innerhalb Servlet
    Von CHaoSlayeR im Forum Java
    Antworten: 2
    Letzter Beitrag: 18.02.05, 12:52
  5. Antworten: 1
    Letzter Beitrag: 02.05.04, 11:59