Wann Bitmap Clone, new oder so belassen ?

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von TRiViUM.

    Wann Bitmap Clone, new oder so belassen ?

    Guten Morgen liebe Community,

    ich habe ein Projekt, wo ich viel mit Bildanalyse/-Bearbeitung mache.
    Insgesamt mache ich jede Sekunde 6 Bilder (1 Bild pro Kamera).
    Diese Bilder möchte ich zum Einen anzeigen und zum Anderen weiter bearbeiten.

    Nun habe ich festgestellt, dass meine Anwendung kontinuierlich Daten in den RAM schäffelt -> MemoryLeak!

    Normalerweise sollten die angezeigten/bearbeiteten Bilder in der nächsten Sekunde wieder überschrieben werden, was sie scheinbar nicht wirklich tun...

    Ich weiß, dass man Bilder mit .Dispose() freigeben kann.
    Ist das zwingend notwendig, wenn ich sie neu zuweise?

    Kurz etwas zur Architektur:
    Ich habe eine Klasse, welche eine Kamera repräsentiert.
    Diese hat eine Methode TakeSnapshot, womit das Bild machen angestartet wird und eine Property Image, die das zuletzt gemachte Bild beherbergt.

    Sobald ein Bild gemacht wurde, wird dies erst noch zurecht geschnitten:

    C#-Quellcode

    1. Bitmap croppedImage = bmp.Clone( cropArea, bmp.PixelFormat );
    2. bmp.Dispose();
    3. return croppedImage;

    Gibt's hier evtl. schon optimierungsbedarf ?
    EDIT: Das Dispose hier führt dazu, dass das Bild im UI leer bleibt.

    Ab hier benötige ich das ursprünglich geschossene Kamerabild nicht mehr, da ich nur noch mit dem zugeschnittenen weiterarbeite.

    Ok, weiter geht's.

    Wurde das Bild zurecht geschnitten, wird ein Event für das UI gefeuert, um das zugeschnittene Bild anzuzeigen.
    Frage: Ist das Bitmap-Objekt ab jetzt gesperrt, weil es in einer PictureBox angezeigt wird?
    Falls nein, könnte ich ja theoretisch immer mit dem selben Bitmap-Objekt weiterarbeiten (bearbeiten etc.)...

    Anschließend wird asynchron eine aufwändige Bildbearbeitung mit dem Bild aus der Property Image vorgenommen (LockBits).
    Vor der Bearbeitung wird allerdings ein neues Bitmap-Objekt erzeugt, da das Bild noch im UI verwendet (angezeigt) wird.


    Die grundlegende Frage ist eigentlich, wann ich ein Bild klonen, wann neu instanziieren und wann ich keines von beiden machen muss.
    Achja, und wann ich es wieder freigeben muss...

    Danke für Eure Hilfe :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „TRiViUM“ ()

    TRiViUM schrieb:

    Ist das zwingend notwendig, wenn ich sie neu zuweise?
    Ja.

    TRiViUM schrieb:

    Frage: Ist das Bitmap-Objekt ab jetzt gesperrt, weil es in einer PictureBox angezeigt wird?
    Nein.
    Überlege, wo die Instanzen stecken.
    Wenn Du einzig zur Anzeige eine Instanz hast, dispose das PictureBox.Image, wenn es Not Nothing ist und weise ihm das neue Bild zu.
    Probiere, pro Zyklus ein

    VB.NET-Quellcode

    1. GC.Collect()
    2. GC.WaitForPendingFinalizers()

    durchzuführen, das hab ich bei einer meiner High-Speed-Kamera-Anwendungen auch drin.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    pro Zyklus

    Danke für den Tipp, hat jetzt scheinbar schon geholfen, ohne etwas anderes zu ändern.

    Was genau bedeutet das?
    Etwa, dass der Speicher in meiner Anwendung zwar nicht mehr verwendet wird, dieser jedoch noch nicht freigegeben wurde?
    Ich dachte, dass der GC sowieso gelegentlich mal diesen garbage collected...

    TRiViUM schrieb:

    Was genau bedeutet das?
    Möglicherweise ist Dein Programm so ausgelastet, dass der GC einfach nicht in der Idle-Zeit seine Aufgaben erfüllen kann.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!