Benutzer mit den meisten Antworten
BitmapFrame an Image.Source zuweisen ==> Image wird nicht angezeigt

Frage
-
Moin!
Ich habe ein Problem, dass mich nun schon einige Zeit beschäftigt. Ich lade ein JPG-File via Stream im BitmapDecoder. Vom Decoder hole ich mir den 0. Frame und weise ihn einem Image-Control als Wert für die Source Eigenschaft zu. Das Problem ist, dass der Frame nun nicht angezeigt wird. Ich habe keine Idee, wo das Problem liegen könnte. Da BitmapFrame eine Spezialisierung von ImageSource ist, sollte das doch eigentlich kein Problem sein. Wenn ich mir im Debugger die Properties vom Frame anschaue, dann sind sie auf den ersten Blick auch völlig in Ordnung.
Was mache ich falsch? Den Weg über Decoder/Frame gehe ich, weil ich die Metadaten bearbeite und den Frame clone um ihn lossless wieder wegzuschreiben.
Hier noch ein Auszug aus dem Code:
string filename = @"C:\Users\marcus\Desktop\testimg_in2.jpg"; BitmapCreateOptions opts = BitmapCreateOptions.PreservePixelFormat | BitmapCreateOptions.IgnoreColorProfile; BitmapCacheOption cache = BitmapCacheOption.Default; FileStream srcStream = new FileStream( filename, FileMode.Open, FileAccess.ReadWrite ); BitmapDecoder decoder = BitmapDecoder.Create( srcStream, opts, cache ); BitmapFrame source = decoder.Frames[0]; TestImage.Source = source; //TestImage.Width = 64; //TestImage.Height = 64; //TestImage.Stretch = Stretch.Fill; srcStream.Close( );
Vielen Dank für jegliche Hilfe!
Beste Grüße
Marcus
Antworten
-
Naja, soweit ich die MSDN verstehe wird mit dieser Option das gesamte Bild in den RAM geladen. Dann wird alles daraus ausgelsen. Ich denke das der Pixelmatsch dadurch entstand, das Teile des Bildes nicht geladen wurden aber der Stream schon geschlossen war, wodurch die CLR nicht mehr auf die atei zugreifen konnte.
Ich war gerade dabei mir die .NET Assemblies etwas genauer anzusehen und zu betrachten. Beim erstellen eines BitmapImage scheint auch auf diese Option gesetzt zu werden.
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier.- Als Antwort markiert M. Fehde Freitag, 5. April 2013 13:39
Alle Antworten
-
Hallo,
bei mir Funktioniert dein Code. Ich habe es mit 2 JPEG Dateien getestet (mit Paint und mit Paint.NET erstellt)
Sieh dir mal die Datei mit einem Programm wie Notepad++ an. Sie sollte in etwa so anfagen:
ÿØÿà**JFIF
Die Sternchen sich Platzhalter für 2 andere, nicht sichtbare Zeichen.Noch 2 kleine Tipps:
- Benutze einen JpegBitmapDecoder anstelle eines BitmapDecoders. Somit wird es eindeutiger
- Benutze einen using-Block anstelle des Close-Befehls:
http://msdn.microsoft.com/de-de/library/vstudio/yh598w02.aspx
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier. -
Hi!
Also, jetzt wird es ja noch komischer... Die Code-Änderungen haben nichts gebracht. Aber - ich habe mal eben ein Jpeg mit Paint erstellt - da wird teilweise geladen. Nach gut der Hälfte die Bildes habe ich aber Pixelmüll. Dann habe ich noch einmal mein original Testbild mit Paint geladen und wieder gespeichert - Ergebnis: es wird nicht angezeigt. Dann habe ich noch einmal ein ganz anderes Jpeg genommen. Es wird geladen, aber das Image-Control ist einfarbig, grau gefüllt.
Was zum Henker ist hier verkehrt? Wenn ich im XAML die Jpegs in der Source-Eigenschaft referenziere (Pfad zur Datei auf der Festplatte), dann ist alles ok.
Hast Du noch weitere Ideen, was hier falsch sein könnte?
Beste Grüße
Marcus -
Naja, soweit ich die MSDN verstehe wird mit dieser Option das gesamte Bild in den RAM geladen. Dann wird alles daraus ausgelsen. Ich denke das der Pixelmatsch dadurch entstand, das Teile des Bildes nicht geladen wurden aber der Stream schon geschlossen war, wodurch die CLR nicht mehr auf die atei zugreifen konnte.
Ich war gerade dabei mir die .NET Assemblies etwas genauer anzusehen und zu betrachten. Beim erstellen eines BitmapImage scheint auch auf diese Option gesetzt zu werden.
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier.- Als Antwort markiert M. Fehde Freitag, 5. April 2013 13:39
-
Da hast Du wohl ins Schwarze getroffen. Sofern ich den Stream offen lassen (weder Close noch using), dann funktioniert es auch mit None.
Tja, dann muss ich wohl dazwischen wählen, alle Images im Speicher zu halten oder jede Menge Handels für Streams zu belegen. Letzteres könnte aber das geringere Übel sein.
Vielen Dank für Deine schnelle Hilfe!