JpegBitmapDecoder funktioniert nicht
-
Ich möchte in meinen Programm ein JPEG bild laden und verwende dazu folgenden code:
Stream imageStreamSource = File.OpenRead("bild.jpg"); imageStreamSource.Position = 0; JpegBitmapDecoder decoder = new JpegBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); image1.Source = decoder.Frames[0]; //Bild anzeigen imageStreamSource.Close();
Bei der Ausführung kommt bei egal welchem Bild ich lade möchte folgende Exception:
Das Bild kann vom Bilddecoder nicht dekodiert werden. Das Bild ist möglicherweise beschädigt.Wenn ich BitmapCreateOptions.None angebe, läuft der code zwar ohne exception aber das bild wird nicht geladen...
Kann mir irgendjemand bei diesem Problem weiterhelfen...
danke im voraus
-
Nimm dir die Exception und Google doch erstmal danach.Mit Sicherheit findest du dort Ursachen warum diese Exception auftritt.
-
hab ich schon, sonst würde ich ja nicht posten....
Ich verstehs nicht, im msdn steht praktisch der gleiche code als beispiel für die verwendung von JpegBitmapEncoder....
-
reichen die .NET Mittel nicht aus um JPEG zu laden?
Image ^ img = Image::FromFile("bild.jpg");
-
Ich habs jetz eigentlich auch so gelöst. Ich bin dabei jetz aber auf ein anderes Problem mit dem JpegImageEncoder gestoßen.
FileStream stream = new FileStream("new.jpg", FileMode.Create); JpegBitmapEncoder encoder = new JpegBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(image)); encoder.Save(stream);
Dieser Code eigzeugt bei mir nur ein 1x1 pixel großes Jpeg File.
-
hab jetzt nich genau ahnung, aber kanns sein dass du nur 1 frame(1 pixel) bei encoder.Frames.Add(...) addest?
-
Image ^ img = Image::FromFile("bild.jpg");...
eine frage hätte ich noch, wie komme ich an die raw-data ran? Ich denke da an eine Funktion .GetRaw, die einen uint pointer liefert? Der Zugriff via get und set pixel ist ja katastrophal...Besten Dank
-
Chruschtschow schrieb:
Image ^ img = Image::FromFile("bild.jpg");...
eine frage hätte ich noch, wie komme ich an die raw-data ran? Ich denke da an eine Funktion .GetRaw, die einen uint pointer liefert? Der Zugriff via get und set pixel ist ja katastrophal...Besten Dank
Man muss es in ein Bitmap umwandeln und dann kann man über LockBits ein BitmapData mit Scan0 auf die ersten Daten zugreifen. Siehe Beispiel in http://msdn.microsoft.com/de-de/library/system.drawing.imaging.bitmapdata.scan0.aspx.
-
Okay, soweit war ich dann auch schon, aber dafür schon mal besten dank. Ich komm eigentlich aus der c++ ecke, und wenn ich mir die adresse des ersten pixels hol, dachte ich mir eigentlich ich könnte da mit diesem pointer, (den die methode LockBits) liefert, linear durch den speicher und somit durch das bild iterieren. allerdings gibt es für den besagten zeiger weder die ++ operation noch ist eine referenzierung möglich. kann man den IntPtr irgendwie in geeigneter weise casten? schon mal besten dank im voraus und nochmals besten dank für die schnelle antwort!
-
-