1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
14
14
ZUGRIFFE
4026
4026
EMPFEHLEN
-
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
-
25.04.08 16:33 #2
- 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.
-
thx werds versuchen und mich dann melden
-
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
-
Das ist die eine Variante. D.h. du arbeitest direkt mit einem Stream.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;
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.
-
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?
-
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.
Einfach mal in die MSDN gucken:
BitmapSource Class (erstes Beispiel).
-
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 eitungGeändert von Andy0709 (29.04.08 um 19:19 Uhr)
-
Ö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.
-
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)
-
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:
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).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); } } }
Anschließend wird über einen BitmapDecoder das Image geladen.
-
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]; } } }
-
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)
-
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)
-
Hmm .. und wenn sich das gleiche Bild inzwischen am Server ändert funktioniert es auch nicht?
Ähnliche Themen
-
byte Array in Datei speichern und wieder in byte Array einlesen
Von riseX im Forum JavaAntworten: 5Letzter Beitrag: 22.02.10, 12:05 -
Convert ImageIcon/ Image/ Graphics2D To Byte Array
Von nathaniells freak im Forum JavaAntworten: 2Letzter Beitrag: 12.03.09, 23:04 -
Image in ein byte array schreiben
Von MCH im Forum JavaAntworten: 1Letzter Beitrag: 30.06.08, 07:08 -
java.awt.Image >> byte[] innerhalb Servlet
Von CHaoSlayeR im Forum JavaAntworten: 2Letzter Beitrag: 18.02.05, 12:52 -
Image Ready, Eine Image Map einem Rollover Sate hinzufügen
Von gummy im Forum PhotoshopAntworten: 1Letzter Beitrag: 02.05.04, 11:59





Zitieren
Login





