2009-04-04 17 views
7

Soru genel olarak çizim sistemleri için geçerlidir. Geri alma işlevselliğinin PS'de nasıl uygulandığını merak ediyordum. Program, her işlemden önce tuvalin anlık görüntülerini alıyor mu? Öyleyse, bu büyük bellek gereksinimlerine yol açmaz mı? Komut şablonuna baktım ama bunun çizim için nasıl uygulanacağını tam olarak göremiyorum.Photoshop Sistemi Geri Al Sistem

Selamlar, Menno

+0

Neden kapatılıyor? Bu bir dupe falan mı? Kapanış, yorumlarla takip edilmelidir –

+0

[Bu SO parçacığı] 'na bir göz atın (http://stackoverflow.com/questions/3541383/undo-redo-implementation/3542670#3542670). – Lazer

cevap

12

O command pattern denir. Herhangi bir editör için yararlı olarak uygulanması kolaydır.

Photoshop orijinal görüntünün üzerine yığılmış dönüşümleri uygular. Bir opetasyon tek komut. Geri aldığınızda sadece dönüşümü baştan çıkarır. Bu yüzden sadece orijinal ve en yeni sürümleri korur, ancak sanırım son birkaç versiyonu sadece performans için önbelleğe alabilir.

+0

Bunu bir WYSIWYG editöründe uygulamıştım. İlk başta imkansız gözüküyor, ama deseni bir kez kavradıktan sonra, gerçekten çok kolay. –

+0

Bu benim aynı tecrübem, asla işe yaramayacağını düşündüm, ve bu bir gizli inisiyatrik olmalıydı, ama bitirdikten sonra sadece çalıştım :) –

+0

Aslında, mevcut sürüm sadece mevcut sürüm ve komut geçmişi aslında tersine çevrilmiş komutların bir listesi. En azından böyle bir kelime işlemci böyle yapardı. – jmucchiello

4

bazı işlemler olmayan tersinir olacak ve her zaman söz konusu bile olurdu tüm görüntüyü snapshoting demek olduğu daha sonra görebildiğim tek alternatif deltalar bir yığın olurdu beri. İşlemden önce değiştirilmiş pikselleri içeren maskeler kümesi olan bir delta. Elbette birçok işlem geri alınabilir ve bu yüzden deltaları optimize edilebilir.

+0

Ayrıca Photoshop, bilgileri geri almak için sabit diski kullanır, dolayısıyla orada ek bellek gereksinimleri yoktur. – Joey

-2

Photoshop eylemlerini izlemek için Geçmiş kullanır. Bunlar, herhangi bir noktada tarihe geri dönebileceğiniz gibi Geri Al işlevi de görür. Tarihin boyutunu tercihlere göre ayarlayabilirsiniz.

Ayrıca, bir geri yükleme veya sürümleri için bir araç olarak Adobe Version Cue içine bakmanızı öneririz, bu tek amaç için paketin içine yerleşik. http://en.wikipedia.org/wiki/Adobe_Version_Cue

+0

Bu soru uygulama detayları ile ilgilidir. – tmcw

4

Ben Adobe Photoshop undo uygulayan emin değilim ama Apple Shake birleştirme uygulaması içinde Boya düğüm açıklamak oldukça kolaydır:

  • Her stoke bazı bilgilerle birlikte, bir dizi nokta olarak saklanır vb inme renkli, fırça-boyutu gibi
  • bir stoke çizmek
  • değişiklikler anki görüntüyü yapılır.
  • Her x vuruş (10 Sanırım) geçerli görüntü belleğe önbelleğe alınır. Eğer geri aldığınızda
  • , önceki önbelleğe alınmış görüntü üzerinde son ~ 9 Stokes yeniden çizer.

    • fazla 10 kez geri aldığınızda, tüm görüntüyü yeniden hesaplamak zorundadır:

    bu iki sorun vardır. Binlerce vuruşla, bu birkaç saniyelik duraklamaya neden olabilir.

  • Shake ile, gerçek piksel değerlerini değil, kontur bilgilerini içeren kurulum dosyasını kaydedersiniz. Ardından, Boya düğümünü yeniden açtığınızda ya da görüntüyü oluşturduğunuzda (neredeyse geri alma gibi büyük bir sorun olmasa bile) tüm görüntüyü yeniden hesaplamanız gerektiği anlamına gelir.

Eh, varlık Sarsıntı, Boya düğümü bunlardan birini beign korkunç adamcağız ve kötü birçok alanda uygulanan olduğu, üçüncü bir sorun vardır - bu yüzden bu kadar iyi bir uygulama emin değilim ama Photoshop'un çok farklı olduğunu hayal edemezsiniz (kadar daha iyi optimize edilmiş).

enter image description here

Sen düşün:

0

Adobe bunu ele nasıl bilmiyorum da, bu sorunu çözmek için bulduk kolay yolu, bu nedenle gibi kalıcı veri yapısını kullanmaktır görüntü karoları topluluğu olarak bir görüntü, her biri 64x64 piksel diyelim ve toplanan çöpleri veya referansları saydılar (örn: C++ içinde shared_ptr kullanarak). O karanlık fayans böyle bir değişimden üzerine kopyalanan sığ hariç

enter image description here

Everything:

Şimdi kullanıcı bir görüntü döşemek için değişiklikler yaptığında, yeni bir sürümünü sığ kopyalama sırasında değiştirilmemiş fayans oluşturun.

before user operation: 
    store current image in undo stack 
on undo/redo: 
    swap image at top of undo stack with current image 

Ve bitti saklanabilir ve üzerinde her girişi geri de olmak tüm görüntüyü gerektirmeden böyle süper kolaylaşır: Eğer bu şekilde yaptığımda, tüm geri alma sistemi bu aşağı kaynar. Kullanıcılar katmanları kopyalayıp yapıştırdıklarında bonus olarak, yapıştırılan katmanda değişiklik yapana kadar, daha fazla bellek harcar. Temelde size görüntüler için bir kayıt sistemi sağlar. Bir başka bonus olarak, bir kullanıcı 2000x2000 piksel saydam bir katman oluşturduğunda, ancak sadece 100x100 piksel gibi bir görüntü çiziyorlar, bu da boş/saydam karoların olmaması nedeniyle neredeyse hiç bellek almıyor. herhangi bir piksel, sadece bir çift boş gösterici saklamak zorunda. Ayrıca, çoğunlukla saydam katmanlarla birleştirmeyi hızlandırır, çünkü boş görüntü döşemelerini alfa harmanlamak zorunda değilsiniz ve sadece bunları atlayabilirsiniz. Aynı zamanda, bu gibi durumlarda görüntü filtrelerini de hızlandırır, çünkü aynı şekilde boş kiremitleri de atlayabilirler.

PS eylemlerine gelince, bu biraz farklı bir yaklaşım. Orada, hangi eylemlerin gerçekleştirileceğini belirtmek için bazı komut dosyaları kullanabilirsiniz, ancak görüntünün yalnızca değiştirilmiş kısımlarını verimli bir şekilde önbelleğe almak için bunu yukarıdakilerle birleştirebilirsiniz. Bu yaklaşımın bütün noktasını, resmin bütünlüğünü derinlemesine kopyalamaktan kaçınmak ve her türlü görüntü için ayrı bir geri alma/yineleme mantığını yazmak zorunda kalmadan bir resmin önceki durumlarını geri almak için bellek kullanımını havaya uçurmaktan kaçınmaktır. Oluşabilecek farklı işlemler.