2011-08-18 31 views
0

我正在開發一個用java編寫的圖像編輯應用程序,當然這需要撤銷 - 重做功能。 我做了什麼...... 已經創建了一個包含bufferedimage的狀態類,引用prev狀態,引用下一個狀態。然後形成一個鏈接的狀態列表,通過點擊撤銷和重做按鈕來回移動。 那麼我想要什麼...... 我發現bufferedimage佔用太多的內存......對於一箇中等(桌面)大小的圖像說4 MB。你可以提出更好的方法嗎?關於圖像編輯中撤銷 - 重做狀態可維護性的建議

謝謝!!

回答

4

如果您的狀態使用太多內存,則應該使用Command pattern而不是Memento pattern

您將擁有UndoRedo對象的鏈接列表,每個對象都包含足夠的信息以便能夠運行撤消命令或重做命令。

你有不同的方式來組織的命令:

  • 具有雙向命令。例如,在更改像素的顏色時,該操作必須同時包含原始顏色和新顏色,以便該命令可以在兩個方向上運行。
  • 對於每個undoredo塊有兩個不同的命令。對於某些改變圖像中所有內容的命令(如更改比例或亮度,其中關於原始圖像的某些信息丟失),必須將命令同時存儲爲重做和撤消命令。它是完整的圖像,內存佔用將與您已有的內容相似。
+1

你可以詳細說明一下圖像編輯的例子嗎?我想他所問的是他如何將'BufferedImage'的鏈接列表轉換爲其他數據結構,以便佔用更少的內存。我試圖理解你想要解釋什麼,所以請你能做到嗎?謝謝。 – Parth

+0

Paarth:感謝您的評論。我現在正在使用與位圖編輯器相關的示例。 – Jerome

+0

爲了減少內存,我們可以利用'getData(Rectangle r)','getRaster()'和'Raster'來設置'setRaster'嗎?我認爲這可以允許只更改'BufferedImage'中的已更改數據?任何人都有這個想法?謝謝。 – Parth