Bildbearbeitung

  • VB.NET

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

    Bildbearbeitung

    Nabend,
    Ich habe mal ein paar Fragen an euch :)

    Ich möchte eine Rückgängigfunktion einbauen, in der das zuletzt gezeichnete zurück gesetzt wird, ich hatte eine Idee, eine List von Bitmaps zu machen, bei jeden Zeichenvorgang wird die neue Bitmap dort eingetragen, und beim Rückgängig machen wird einfach jeweils immer die vorige wiederhergestellt, jedoch musste ich schnell feststellen, das bei großen Bildern, der Speicher ziemlich schnell absäuft, habt ihr da ein paar Vorschläge?


    Wie sollte ich Bitmaps handhaben? Gibt es Möglichkeiten sie ziemlich klein im Speicher zu halten? Sollte ich lieber Image benutzen und dann implizit umwandelt, oder gleich Raw das Bitmapformat benutzen?


    Danke
    Hi
    du kannst außerdem einen Cache auf der Festplatte anlegen. Im Normalfall sollte bei der Bildbearbeitung eine Veränderung in relativ großen Zeitabständen ablaufen. Daher hätte ich eine Queue-artige Klasse empfohlen, die eben Enqueue und Dequeue als Methoden hat und in einem separaten Thread schreibt. Dequeue wartet solange, bis ein Element vorhanden ist (per System.Threading.Monitor.Wait) oder ein Abbruch erfolgt. Enqueue reiht ein Element ein und informiert dann den wartenden Thread (per System.Threading.Monitor.Pulse/PulseAll). Entsprechend müsstest du halt bei Back immer den letzten Eintrag aus dem Cache lesen (entweder aus der Datei oder aus dem Speicher, sofern noch nicht gespeichert), wenn ein "Zurück" angefodert wird. Beim Vorwärts läufts gleich ab. Da wäre es ganz gut, wenn du einfach eine Liste von Offsets einführst, die dir halt innerhalb des Caches den Offset angibt.
    Was dann in dem Cache drinsteht, ist dir überlassen, aber ich würde den Schreibvorgang auf jeden Fall asynchron implementieren, sonst kann es bei größeren Veränderungen und Bildern zu größeren Wartezeiten kommen. Meist wird übrigens nur eine bestimmte maximale Cachegröße oder Anzahl von gespeicherten Schritten erlaubt.

    Gruß
    ~blaze~
    Mach es wie bei Paint.
    Merk Dir immer nur die letzte oder die letzten beiden Aktionen, das sollte eigentlich reichen, also 2 oder 3 Bitmaps, dafür sollte Platz sein.
    Bei Paint ist eine Aktion durch die Veränderung von MouseDown bis MouseUp definiert.
    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!
    Ich weis nicht, as du genau mit dem Bild machst. Aber es sind ja normalerweise eine Reihe Aktionen, die mit einem Auslöser (Klick) und Parametern definiert werden. Du könntest also das Originalbild speichern und die Aktionen in einer Liste/Tabelle ablegen. Die Aktionen sollten beim Abrufen der Tabelle Zeile für Zeile nachvollzogen werden können. So kannst du in den durchgeführten Aktionen vor und zurück navigieren. Soweit ich weiß, macht das Picasa so.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup: