So Kopieren Sie die Bitmap.Bild in c#
Habe ich einige Probleme mit speichern eines Bildes aus memorystream.
Hier ist mein code:
MemoryStream ms = new MemoryStream(onimg);
if (ms.Length > 0)
{
Bitmap bm = new Bitmap(ms);
returnImage = (Image)bm.Clone();
}
ms.Close();
returnImage.Save(@"C:\img.jpeg");
Und auf returnImage.Save
ich habe die folgende Ausnahme:
A generic error occurred in GDI+.
Wenn ich nicht in der Nähe der MemoryStream
alles OK ist, aber das erfordert sehr viel Speicher nach einiger Zeit.
Wie kann ich dies tun?
EDIT:Das Speichern ist nur die Demo.. ich muss wirklich returnImage für es in ObservableCollection und Anzeige in Fenster, wenn ich es Brauche konvertieren System.Windows.Media.Imaging.BitmapImage();
[ValueConversion(typeof(System.Drawing.Image), typeof(System.Windows.Media.ImageSource))]
public class ImageConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
//empty images are empty...
if (value == null) { return null; }
var image = (System.Drawing.Image)value;
//Winforms Image we want to get the WPF Image from...
var bitmap = new System.Windows.Media.Imaging.BitmapImage();
bitmap.BeginInit();
MemoryStream memoryStream = new MemoryStream();
//Save to a memory stream...
image.Save(memoryStream, ImageFormat.Bmp);
//Rewind the stream...
memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
bitmap.StreamSource = memoryStream;
bitmap.EndInit();
return bitmap;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
return null;
}
}
- Und XAML-wenn ich dies tun
<DataTemplate>
<Image Width="32" Height="32" Source="{ Binding Thumb, Converter={StaticResource imageConverter} }" />
</DataTemplate>
- Was passiert, wenn Sie .Speichern, bevor Sie .Schließen Sie den MemoryStream?
- Warum haben Sie verwenden, um ein Bitmap-Objekt? Kann Sie speichern Sie die Datei mit FileStream? Was ist onimg?
- kann man das nicht melden das eigentliche exception-Meldung ?
- Ich habe laufen in dieses problem vor, die Fehlermeldung ist einfach: "A generic error occurred in GDI+'. Hier finden Sie einige weitere Infos: social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/...
- Brissles:returnImage ist eine Globale variable und muss ich es in einer anderen Klasse nach dieser Methode endet. So habe ich keine chance, um in der Nähe Memorystream, nachdem ich die Arbeit mit returnImage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut Dokumentation:
Bitmap speichern muss seine Daten samewhere, und ich folgern (obwohl keine Beweise für diese), dass
Bitmap
nicht die Daten kopieren, statt mit dem Strom, hält eine Sperre auf es.Auch, es gibt keine Beweise dafür, dass
Clone
neue bitmap mit der Kopie von byte-Darstellung. Und Ihre testcase vermuten lässt ist es nicht der Fall.Also, ich fürchte, Sie müssen Ihre Streams öffnen für das Leben von Ihrem image. Es verlangt ein gutes Gedächtnis, stimmt, aber sonst, wenn Bitmap kopiert die Daten, müssen Sie immer noch, dass der Speicher für die bitmap-Darstellung. Daher nicht mehr Speicher verbraucht wird, mit "stream öffnen" (wenn meine vorherigen Abzug true).
Wenn Sie wirklich wollen, zu überwinden, die bitmap Abhängigkeit von der ursprünglichen Speicher-stream, müssen Sie zeichnen die orginal-bitmap auf das neue statt Klonen wie hier.
Aber dies wird Auswirkungen auf die Leistung, ich würde besser zu re-analysieren, wenn es nicht eine gute Idee, um die original-stream, nur sicherstellen, dass es geschlossen ist, wenn bitmap entsorgt wird.
Nicht auf der Festplatte speichern eigentlich ein Klon?