2009-04-04 35 views
7

Câu hỏi có thể áp dụng cho các hệ thống vẽ nói chung. Tôi đã tự hỏi làm thế nào các chức năng undo được thực hiện trong PS. Chương trình có chụp nhanh ảnh nền trước mỗi thao tác không? Nếu vậy, điều này sẽ không dẫn đến yêu cầu bộ nhớ lớn? Tôi đã nhìn vào mẫu Command, nhưng tôi không thể hoàn toàn thấy cách này sẽ được áp dụng để vẽ.Photoshop Undo System

Kính trọng, Menno

+0

Tại sao lại đóng? Đây có phải là bản dupe hay gì đó không? Đóng cửa nên được theo sau bởi các ý kiến ​​ –

+0

Hãy xem [chủ đề SO này] (http://stackoverflow.com/questions/3541383/undo-redo-implementation/3542670#3542670). – Lazer

Trả lời

12

Nó được gọi là các command pattern. Nó đơn giản để thực hiện như là hữu ích cho bất kỳ loại biên tập viên.

Photoshop áp dụng các phép biến đổi xếp chồng lên nhau theo hình ảnh gốc. Một lệnh opetation one. Nó chỉ đơn giản là unapplies chuyển đổi khi bạn hoàn tác. Vì vậy, nó chỉ giữ các phiên bản gốc và mới nhất, nhưng tôi đoán nó có thể lưu vào bộ nhớ cache vài phiên bản cuối cùng chỉ để thực hiện.

+0

Tôi đã thực hiện điều này trong trình soạn thảo WYSIWYG. Nó có vẻ như không thể lúc đầu, nhưng một khi youg nắm bắt các mô hình, nó thực sự khá dễ dàng. –

+0

Đó là kinh nghiệm tương tự của tôi, tôi nghĩ rằng nó sẽ không bao giờ hoạt động, và rằng phải có một bí mật, nhưng một khi tôi đã hoàn thành nó chỉ làm việc :) –

+0

Trên thực tế, phiên bản hiện tại chỉ là phiên bản hiện tại và lịch sử lệnh thực sự một danh sách các lệnh đảo ngược. Ít nhất đó là cách một bộ xử lý văn bản sẽ làm điều đó. – jmucchiello

4

Vì một số thao tác sẽ không thể đảo ngược và khi bạn nói chụp nhanh toàn bộ hình ảnh mỗi lần thoát khỏi câu hỏi thì chỉ có một thay thế khác tôi có thể thấy là một vùng đồng bằng. Một delta là tập hợp các mặt nạ chứa các pixel đã sửa đổi trước khi hoạt động. Tất nhiên nhiều hoạt động có thể được đảo ngược để các vùng đồng bằng có thể được tối ưu hóa.

+0

Ngoài ra Photoshop sử dụng đĩa cứng để hoàn tác thông tin, do đó không yêu cầu thêm bộ nhớ ở đó. – Joey

-2

Photoshop sử dụng Lịch sử để theo dõi hành động của chúng. Chúng cũng phục vụ như Undo khi bạn có thể quay trở lại lịch sử bất cứ lúc nào. Bạn có thể đặt kích thước lịch sử trong tùy chọn.

Tôi cũng đề nghị bạn xem xét Phiên bản Adobe Cue như một công cụ để xem lại hoàn tác hoặc phiên bản, nó được tích hợp vào bộ phần mềm cho mục đích duy nhất đó. http://en.wikipedia.org/wiki/Adobe_Version_Cue

+0

Câu hỏi này là về chi tiết triển khai. – tmcw

4

Tôi không chắc chắn như thế nào Adobe Photoshop thực hiện undo, nhưng nút sơn trong Apple Shake ứng dụng compositing là khá dễ dàng để giải thích:

  • Mỗi stoke được lưu giữ như một loạt các điểm, cùng với một số thông tin như màu sắc đột quỵ, kích thước bàn chải, v.v.
  • Khi bạn vẽ một đoạn, các thay đổi được thực hiện trên hình ảnh hiện tại.
  • Mỗi x đột quỵ (10 tôi nghĩ) hình ảnh hiện tại được lưu vào bộ nhớ.
  • Khi bạn hoàn tác, nó sẽ vẽ lại ~ 9 stokes cuối cùng trên hình ảnh đã lưu trước đó.

Có hai vấn đề với điều này:

  • Khi bạn lùi lại hơn 10 lần, nó phải tính toán lại toàn bộ hình ảnh. Với hàng ngàn nét, điều này có thể gây ra một vài giây tạm dừng.
  • Với Lắc, bạn lưu tệp thiết lập, chứa thông tin về đột quỵ - không phải giá trị pixel thực tế. Sau đó, có nghĩa là bạn phải tính toán lại toàn bộ hình ảnh bất cứ khi nào bạn mở lại nút Sơn hoặc hiển thị hình ảnh (không phải là vấn đề lớn như hoàn tác, tuy nhiên).

Vâng, có một vấn đề thứ ba, đó là Shake là khủng khiếp lỗi và kém được thực hiện ở nhiều khu vực, nút Paint là một trong số đó - vì vậy tôi không chắc chắn việc thực hiện tốt như thế nào, nhưng tôi không thể tưởng tượng Photoshop là quá khác nhau (mặc dù đến nay được tối ưu hóa tốt hơn).

0

Cách đơn giản nhất tôi đã tìm thấy để giải quyết vấn đề này, mặc dù tôi không biết làm thế nào Adobe đã khắc phục nó, là sử dụng một cấu trúc dữ liệu liên tục, như vậy:

enter image description here

Bạn nghĩ một hình ảnh dưới dạng tập hợp các lát hình ảnh, mỗi trang có kích thước 64x64 pixel và chúng được thu thập rác hoặc tính tham chiếu (ví dụ: sử dụng shared_ptr trong C++).

Bây giờ khi người dùng thực hiện thay đổi một ngói hình ảnh, bạn tạo ra một phiên bản mới trong khi sao chép cạn gạch chưa sửa đổi:

enter image description here

Tất cả mọi thứ trừ những gạch tối đang cạn sao chép khi một sự thay đổi như vậy. Và khi bạn làm điều đó theo cách đó, toàn bộ hệ thống của bạn lùi lại nắm này:

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

và nó trở nên siêu dễ dàng như vậy mà không đòi hỏi toàn bộ hình ảnh được lưu trữ hơn và hơn trong mỗi undo nhập cảnh. Là phần thưởng khi người dùng sao chép và dán lớp, nó hầu như không mất thêm bộ nhớ nào trừ khi/cho đến khi họ thực hiện thay đổi đối với lớp được dán đó. Về cơ bản nó cung cấp cho bạn một hệ thống instancing cho hình ảnh. Như một phần thưởng khác, khi người dùng tạo một lớp trong suốt, ví dụ, 2000x2000 pixel nhưng họ chỉ vẽ một chút hình ảnh, như chỉ nói 100x100 pixel, cũng hầu như không mất bất kỳ bộ nhớ nào vì các ô trống/trong suốt không phải lưu trữ bất kỳ pixel nào, chỉ một vài con trỏ null. Nó cũng tăng tốc độ kết hợp với các lớp chủ yếu trong suốt như vậy, bởi vì bạn không phải trộn lẫn các ô hình ảnh trống và chỉ có thể bỏ qua chúng. Nó cũng tăng tốc bộ lọc ảnh trong những trường hợp đó vì chúng cũng có thể bỏ qua các ô trống.

Đối với các hành động của PS, đó là một cách tiếp cận khác. Ở đó bạn có thể sử dụng một số kịch bản để chỉ ra những hành động để thực hiện, nhưng bạn có thể kết hợp nó với các bộ đệm ở trên để hiệu quả chỉ bộ nhớ đệm sửa đổi của hình ảnh. Toàn bộ điểm của phương pháp này là tránh phải sao chép toàn bộ hình ảnh một cách toàn bộ và thổi phồng bộ nhớ sử dụng để lưu trữ các trạng thái trước đó của một hình ảnh để hoàn tác mà không cần phải viết bằng cách viết logic hoàn tác/làm lại riêng biệt cho tất cả các loại các hoạt động khác nhau có thể xảy ra.