Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi image ständig speichern um undo und Redo zu ermöglichen ? (https://www.delphipraxis.net/118490-image-staendig-speichern-um-undo-und-redo-zu-ermoeglichen.html)

Praxist 8. Aug 2008 16:48


image ständig speichern um undo und Redo zu ermöglichen ?
 
Hallo

wie speichere ich mein Image beim zeichnen, damit ich ein paar Schritte vorwärts oder
Rückwärts beim Fehler machen kann ?
Wie kann man Programm wissen ob was auf Image neu gezeichnet wurde damit es sie speichert ? : (

oder muss ich jedes mal die Image beim MouseUp speichern ?

API 8. Aug 2008 16:56

Re: image ständig speichern um undo und Redo zu ermöglichen
 
Zitat:

Zitat von Praxist
oder muss ich jedes mal die Image beim MouseUp speichern ?

Kommt darauf an, ob Pixel für Pixel rückgängig gemacht werden soll oder jeweils bis zum letzten OnMouseUp

Praxist 8. Aug 2008 17:05

Re: image ständig speichern um undo und Redo zu ermöglichen
 
Ich weiß nicht welches is besser aber wie ich sehe, bis zum letzten OnMouseUp
Ich möchte zum Beispiel für den Anwender nur 3 oder 4 Schritte zurück ermöglichen.
Es sollte ausreichen sein

rollstuhlfahrer 8. Aug 2008 18:25

Re: image ständig speichern um undo und Redo zu ermöglichen
 
HI,

du könntest dein Bitmap jedes Mal als KOPIE in ein anderes Bitmap eines selbstsortierenden Arrays speichern. Ab gewissen Größen solltest du vllt. Probleme bekommen, wenn du 10 Schritte rückgängig machen willst und dein Bild 20 MPixel groß ist. Da könnte es dann schon zu einer erhöhten Speichernutzung kommen.
Was du aber auch machen kannst ist, dass du das ursprüngliche Bild speicherst und bei jedem Zeichnen alle Änderungen draufzeichnest, sodass du alle Änderungen bis zum letzten Speichern rückgängig machen kannst.

Bernhard

Medium 9. Aug 2008 02:32

Re: image ständig speichern um undo und Redo zu ermöglichen
 
Alternativ überlegt man sich eine Form von internem "Script", über welches alle Zeichenoperationen genau abgebildet werden können. Das kann sowas einfaches sein wie ein Record in dem aufgeführt ist "was?", "von wo?", "wo hin?", "farbe", etc. pp., halt alles was man zeichnen kann, bis hin zu einer regelrechten Sprache mit Syntax und allem Gedöns (welche dann, wenn nur intern verwendet, jedoch nicht unbedingt Klartext sein muss).
Dann muss man nur noch ein einziges Ausgangsbitmap als ganzes speichern, und von da an nur noch die deutlich kleineren Änderungs-"Scripte". Will man dann einen Schritt zurück, führt das Zeichenprogramm vom Bitmap aus einfach alle Script-Schritte weniger eins aus. Diese Methode ist zunächst einmal etwas aufwendig und will sehr gut gelpant und durchdacht sein, aber ab einer gewissen Schrittanzahl bzw. Bildgröße ist es der einzig praktikable Weg zu einer Undo/Redo Funktion. Photoshop ist da ein prima Beispiel.


Edit: Eine andere Variante die erheblich einfacher ist ist es, wenn du jeweils immer nur die Differenzbilder zu einem "ersten" Referenzbild speicherst, und diese dann z.B. mit der zLib o.ä. komprimiert ablegst. Gekniffen ist man dan nur in solchen Extremfällen, wenn in einem Schritt sehr viel Bild geändert wurde (FloodFill ohne Grenzen z.B.). Jedoch dürfte dieser Weg auch aus Sicht der Geschwindigkeit dem o.g. unterliegen, weil für jedes Undo N kleine Streams dekomprimiert und verknüpft werden. Ich würde jeder Zeit zu obigem tendieren ;)

Praxist 10. Aug 2008 09:18

Re: image ständig speichern um undo und Redo zu ermöglichen
 
Es hat geklappt mit array
Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz