為什麼 Photoshop 不能無限撤銷?
為什麼 Photoshop 不能無限撤銷,好像最多只能撤銷1000步。而手機上的一些修圖app就可以,比如潑辣修圖,比如snapseed,無限撤銷感覺也不會佔用很多內存啊,那麼無限撤銷的原理是什麼?為什麼 PS 至今不能做到?
首先你要了解,圖片的修改分為 distructive 和 non-destructive。像 Lightroom/CameraRAW 和你提到的手機修圖,它們都是 non-destructive 方式。
Non-destructive 是你的任何編輯都可以用一種數據量遠遠小於原圖的參數來描述。比如曝光度的變化,彩色變黑白,加暗角。但是 non-destructive 的局限性也很大。Edit 的種類有限,而且不能做二次編輯的疊加。
Non-destructive 的歷史你存一萬個也沒事,因為只是一些參數而已。
Photoshop 的大多數操作都是 destructive 操作。每次操作要記錄的歷史信息都是一大塊 pixels data。雖然有 copy-on-write 和 disk swap 功能,也不能無限的支持。實際上,是有可能做到無窮步驟的。大不了只需要把內存存放的歷史數據倒騰到硬碟上就可以,我的軟體就是這樣處理的,步驟無限制。但是Photoshop為什麼不這樣做呢?
因為如果要恢復到歷史上任意一步,那麼最簡單把當時的所有數據都存下來即可這個前面的答案提到了。但是現在數碼相機像素動則幾千萬,再建立幾個圖層,這一步數據就可以達到,以2千萬像素16bit通道圖片為例。就這個圖層就佔用了,20000000 x 3通道 x 2byte = 120000000 = 120M 空間。加上掩模和其他圖層....這還只是一步的數據。
那麼存儲10步就需要1.2G了,要知道32bit系統最多也就能分配給程序1G多程序。所以即便是有限步驟,按照這樣的存法,不管是存到內存還是硬碟,都是不太可行的。能壓縮么?不太可行,因為歷史紀錄必須保證是無失真的,否則來回恢復-重做幾次,圖片就損失得不能看了。而無失真壓縮一個圖片,壓縮率之低,做過圖片壓縮的同學應該很清楚吧。
所以就動腦筋了,每一步只存儲變化的區域,這是一個簡單方法。只記錄處理參數,這也是個辦法...但是這樣的辦法又帶來另外一個問題,就是依賴性。如果要恢復到特定步驟,那麼,就得從最開始的圖片開始,重新重複每一個步驟的變化,最後得到特定步驟的重現。如果處理步驟很多,那麼要恢復上1,2步就變得非常慢。不能接受。
這類似於視頻壓縮的I幀和P幀的關係。那麼按照一定規則,插入I幀,提高速度?當然可以,這樣雖然會耗費多一點存儲,但是兼顧了速度。
以上講的是歷史紀錄大致的結構和原理。
那麼現在只剩下一個問題,就是這些數據放在內存還是硬碟上? 放在內存,響應很快,但是內存有上限,尤其是32bit系統;放在硬碟,典型硬碟讀速度在100M/s,SSD快一些,也只有400M左右,那麼僅僅是讀取上面說的一步數據,而且還是理想情況下,光導入到內存就需要1秒鐘。而內存的速度一般是以幾十GB數量級的(上百倍)。所以這個瓶頸會造成恢復很慢。
考慮到Photoshop的目標是做設計為主,設計師反覆的恢復-重做操作相當多,因此,對響應速度要求高,所以選擇犧牲步數,換取性能的內存方式比較適合。(而我的軟體處理簡單,用戶也一般不需要用歷史紀錄,所以就放硬碟上,I,P幀方案,不做步數限制。實際操作中,歷史恢復速度的確是比較慢的(5秒級別))。
當然,實際Photoshop中的實現會複雜很多,它有一套設計得很好的內存管理機制。這裡就不展開了。每次撤銷都得保存一個新版本。無限撤掉需要無限存儲空間支持。PS是專業軟體,美工做圖每個文件上GB都是常見的。1000次撤銷最高可能需要幾個T的硬碟存儲空間。再多也沒有實用價值了。
ps本身文件大,如果無限次撤銷,內存和硬碟緩存佔用就會太大,效率反而低
曾經做過測試,作為測試如果開發敢在規格里寫無限撤銷,我直接一板磚就拍過去。只問一個問題,怎麼才能通過測試證明確實可以無限撤銷?如何驗收這個需求?
不考慮內存和硬碟限制,一秒可以完成一次操作或者撤銷,通過腳本測試一年的操作加一年的撤銷。那麼最多可以測試到多少層的撤銷呢?
365*24*3600=不到4千萬,而這個數字可以代表無限嗎?不能!你怎麼知道5千萬或者一億的時候沒有問題?畢竟連32位INT的百分之一都還沒有到,你怎麼知道之後會不會有溢出(操作編號)。
軟體是不能用數學歸納法來證明沒有問題的,所以規格寫無限的一定是吹牛!好多專業的回答。
但是在歷史記錄面板里就可以啊。
要圖層幹嘛的
那你在手機上撤銷過一千次嗎? 為何會覺得不佔用內存啊? 每次都生成一個臨時文件在你的緩存檔里啊 。當你有足夠的空間你可以設緩存到無限大試試
從實用角度說,多建層,並在合併任何層之前保存為備份的版本,基本就夠後悔用的了。
純屬無聊加蛋疼的問題,1000步的你一下一下退回去。保證酸爽死你。
無限撤銷?你重新做吧。。。得了
不是有圖層嗎,撤銷那麼多沒有意義
是不是因為,你撤銷的的這一步已經成為了上一步,再撤銷就回到了撤銷那一步,然後就是一直這兩步循環了
用歷史記錄挺方便的反對高票adobe程序員的答案。扔出來一堆名詞,繞來繞去也根本沒解釋清楚為什麼不能無限撤回。
說到底不就是緩存嗎?跟destructive和non-destructive有什麼關係?你ps設置可以撤銷20步,這20步以內不管你de不destructive是不是都可以撤銷?真是無語推薦閱讀:
※日常回答存根3——如何模擬任意一張照片的後期?
※逆天PS:他把現實ps到童年照片之後,一點也不違和
※小清新詳細教程,Lightroom直出調色
※從0開始學修圖 | 調色風格化之色調分離,你值得擁有
TAG:AdobePhotoshop | 攝影 | 平面設計 | 修圖 | Photoshop使用技巧 |