Trải nghiệm tái hiện Photoshop bằng C++
(f055.net)- Điểm khởi đầu là trải nghiệm tạo trình đọc truyện tranh cá nhân Fiew vào mùa hè năm 2006, từ đó tác giả hiện thực hóa Fedit, một trình chỉnh sửa ảnh tương tự Photoshop, bằng C++ và Windows API như một dự án luận văn tốt nghiệp
- Fedit hoạt động dưới dạng một tệp thực thi duy nhất, không cần trình cài đặt, tệp nén, khóa registry hay runtime bổ sung, nên có thể chạy ngay trên PC bị giới hạn quyền hoặc từ USB
- Giao diện được thiết kế để mô phỏng quy trình làm việc của Photoshop cổ điển, bao gồm các cửa sổ công cụ nổi, bộ chọn màu, quản lý layer, lịch sử hoàn tác, bộ lọc ảnh và bộ lọc dịch chuyển pixel tùy biến
- Khó khăn lớn nhất là tái hiện giao diện người dùng; việc triển khai cơ chế snap/unsnap của bảng thiết lập công cụ cùng bộ chọn màu và bộ chọn công cụ đã tốn rất nhiều thời gian
- Dự án dẫn đến việc hoàn thành thành công luận văn và nhận bằng cử nhân kỹ thuật, đồng thời gây ấn tượng với CTO của GoldenLine, từ đó mở ra một công việc C++ xây dựng ứng dụng WinAPI để tải lên hàng loạt hình ảnh
Từ trình đọc truyện tranh Fiew đến trình chỉnh sửa ảnh Fedit
- Vào đầu mùa hè năm 2006, điểm khởi đầu là sự không hài lòng với các ứng dụng đọc ảnh hiện có
- Đặc biệt, việc không thể điều khiển việc đọc chỉ bằng chuột khiến tác giả phải liên tục với tay tới bàn phím, rất bất tiện
- Khi đó tác giả vừa hoàn thành khóa học C++/Windows API ở trường đại học và đã tự phát triển một trình đọc truyện tranh lý tưởng trong kỳ nghỉ hè
- Trình đọc truyện tranh này có tên là Fiew
- Đầu mùa thu năm 2006, tác giả phải chọn đề tài luận văn tốt nghiệp, và vì việc phát triển trình xem ảnh diễn ra thuận lợi nên đã cho rằng mình cũng có thể làm một trình chỉnh sửa ảnh
- Vì khi đó đang sử dụng Adobe Photoshop rất nhiều, mục tiêu trở thành một trình chỉnh sửa tương tự Photoshop
Cách triển khai Fedit và các ràng buộc khi phân phối
- Fedit là một Advanced Image Editor được viết bằng C++, sử dụng Windows API và thư viện đồ họa GDI+
- Để có hình thức phân phối thuận tiện cho người dùng, tác giả tuân theo năm quy tắc
- Không có trình cài đặt
- Không có tệp nén
- Không có khóa registry
- Không có runtime bổ sung
- Một tệp thực thi duy nhất
- Kết quả là một chương trình có thể chạy ngay không cần cài đặt, hoạt động được trên các hệ thống có quyền hạn chế hoặc từ USB, đồng thời dùng ít tài nguyên
Giao diện và tính năng gần với Photoshop
- Giao diện được xây dựng cẩn thận để trông giống Photoshop cổ điển và bao gồm các tính năng thường dùng
- Các tính năng chính như sau
- Cửa sổ công cụ nổi tự do
- Bộ chọn màu
- Quản lý layer dễ dàng
- Lịch sử cho phép hoàn tác theo từng bước
- Nhiều bộ lọc ảnh
- Giao diện ma trận cho phép tự mã hóa bộ lọc dịch chuyển pixel
- Ứng dụng cũng bao gồm trình xem thư viện ảnh quy mô lớn được mang sang từ dự án trước là Fiew
- Có thể cuộn qua một lượng lớn ảnh một cách nhanh chóng và dễ dàng
Quá trình phát triển phải tự mình gỡ lỗi
- Dù đã tham khảo rất nhiều MSDN và Experts Exchange, các vấn đề quá cụ thể nên phần lớn vẫn phải tự phân tích và gỡ lỗi
- Vì phải kịp hạn chót nộp luận văn cử nhân, trong hai tháng cuối tác giả đã làm việc 14 tiếng mỗi ngày
- Phần khó nhất là giao diện người dùng
- Tác giả muốn quy trình làm việc giống Photoshop nhất có thể
- Đặc biệt khó là hành vi snap và unsnap tự do của bảng thiết lập công cụ
- Việc tái hiện bộ chọn màu và bộ chọn công cụ cũng không hề dễ
- Đến gần cuối dự án, tác giả đã khá kiệt sức và thậm chí nảy sinh ác cảm với WinAPI
Kết quả sau luận văn và tài liệu công khai
- Luận văn thành công và tác giả nhận bằng Bachelor of Science in Engineering tại Warsaw University of Technology
- Fedit nhận được một số bài đánh giá tích cực trên mạng, nhưng tác giả không quảng bá tích cực
- Sau đó, Fiew và Fedit đã gây ấn tượng với CTO của GoldenLine, dẫn đến công việc C++ xây dựng một ứng dụng WinAPI hiệu quả cao để tải lên hàng loạt hình ảnh cho một bản sao Flickr
- Tài liệu công khai
- Mã nguồn Fedit và Fiew: có thể xem trên GitHub
- Tài liệu luận văn PDF: tài liệu luận văn về Fedit
- Web Archive của website ứng dụng gốc: bản lưu trữ website thời đó
- Thảo luận trên Hacker News: trang thảo luận liên quan
1 bình luận
Ý kiến trên Hacker News
Đọc câu “năm quy tắc có lợi cho người dùng: không trình cài đặt, không tệp nén, không khóa registry, không runtime bổ sung, một tệp thực thi duy nhất” khiến tôi cảm thấy ấm áp và hạnh phúc
Tôi hiểu vì sao registry tồn tại, và vì sao hệ sinh thái phần mềm Windows ngày nay vận hành như vậy, nhưng tôi thật sự nhớ thời hầu hết phần mềm desktop từng đơn giản như trước đây
Dạo này nếu có thể tôi dùng bản cài đặt portable, và ước gì cách này phổ biến hơn. Thời gian, sự bất tiện và cảm giác không chắc liệu có thể khôi phục hoàn toàn cấu hình hay không khiến tôi chủ động né việc cài lại Windows
Trước đây tôi rất thích phần mềm portable, nhưng dạo này nếu có cả hai lựa chọn thì tôi lại thích trình cài đặt hơn. Nếu không, muốn tìm kiếm được thì phải tự thêm vào Start Menu
Tuy nhiên tôi ghét khóa registry. Vì chúng thường biến mất khi cài lại hệ điều hành. Tôi chỉ muốn cấu hình được lưu trong %appdata%
Một phương án khác là dùng NSIS để đóng gói thành một tệp thực thi duy nhất rồi giải nén toàn bộ vào thư mục tạm trước khi chạy
Tôi xem Windows Registry gần như là một mớ hỗn độn thiếu nhất quán và được thiết kế tệ. Để so sánh, registry của Gnome được thiết kế tốt. Những thứ như mô tả khóa, các lựa chọn giá trị có giới hạn, hiển thị giá trị mặc định là thiết kế giao diện người dùng tốt
Chỉ cần nhìn vào Group Policy của Windows và cách ánh xạ với registry cũng thấy cùng một cấu trúc logic nhưng mỗi chỗ một kiểu, lại còn có cả phủ định kép trong khóa
Hiện vẫn có thể thấy dấu vết đó trong HKEY_CLASSES_ROOT
Về mặt kỹ thuật, vẫn có thể tạo đối tượng mà không cần registry. Chỉ cần nạp DLL, rồi gọi hàm được export để tạo đối tượng Factory, sau đó dùng Factory đó để tạo instance. Bản thân COM cũng làm việc theo cách đó
Bài viết cũng là một hồi tưởng thật tuyệt. Tuy nhiên tôi ước tác giả đi sâu hơn vào những khó khăn đã được gợi ý nhẹ ở phần đầu. Dù vậy đó chỉ là bắt bẻ nhỏ, bài viết rất hay và công việc thực tế trông khá ấn tượng
Photoshop có rất nhiều tính năng, nên chỉ vài bộ lọc ảnh thì khó gọi là tái hiện
GIMP năm 2006 cũng có cực nhiều tính năng, nhưng so với giao diện của Photoshop thì thật sự kinh khủng
Cũng nên có liên kết đi thẳng tới dự án tuyệt vời này
https://github.com/f055/fedit-image-editor
Đoạn “Tôi không quảng bá nó. Vài tháng sau tôi kiếm được một công việc C++. Rốt cuộc, mọi nỗ lực đó đã được đền đáp” khá thú vị
Theo bản năng, chúng ta biết rằng việc đã bỏ công vất vả nên được đền đáp, nhưng thật đáng tiếc là các nhà phát triển mã nguồn mở, đặc biệt là những người đổ nhiều công sức vào mã được dùng rộng rãi trong production, lại quá thường xuyên gần như không nhận được phần thưởng thực tế nào
Vì vậy có lẽ họ tìm kiếm phần thưởng về danh tiếng, hoặc NPM thêm tính năng kiểu “bạn có muốn quyên góp cho tác giả thư viện này không”, và GitHub tạo tích hợp Patreon
Chúng ta cần một mô hình tốt hơn hiện nay, không lợi dụng những nhà sáng tạo trẻ ngây thơ nhưng chăm chỉ
Đầu những năm 2000 có một dự án tên pixel32, về sau là Pixel Studio Pro. Nó trông thật sự khá ổn và được bán dưới dạng early access
Nhưng cuối cùng nó trở thành vaporware, những người đã trả tiền rất tức giận, và người tạo ra nó nhanh chóng chuyển từ anh hùng thành kẻ phản diện
https://discuss.haiku-os.org/t/pixel-studio-pro-in-past-call...
Tác giả nói đã tốt nghiệp Warsaw University of Technology, nơi này ở đây luôn được xem là một trong những trường khá tốt
Ngoài chuyện đó, cũng đáng chú ý là luận văn thời đó khác hiện nay đến mức nào. Gần đây tôi viết luận văn ở một trường đại học kỹ thuật tại một thành phố lớn khác, và 90% luận văn kỹ sư của chúng tôi có chất lượng khá thấp, bao gồm cả của tôi
Có thể có những luận văn nổi bật, nhưng phần lớn có lẽ khá nhàm chán
Vì vậy tôi thích Windows. Có cực kỳ nhiều phần mềm nhỏ, mã nguồn mở, đáp ứng rất tốt các ngách cụ thể
Trước đây tôi thường lang thang tìm kiếm ở sourceforge.net và freshmeat, hình như tên là vậy
Một người bạn làm ở Phonegap, sau khi bị Adobe mua lại khoảng 10 năm trước, đã nhanh chóng port Photoshop sang JavaScript cho vui
Tôi đã nghĩ câu chuyện về một dự án hack nội bộ của kỹ sư phần mềm sẽ thú vị, nhưng thôi biết sao được
Có những thứ người ta làm ra rồi không nói cho thế giới biết. May mà nó đã được đưa lên GitHub, và thật sự ấn tượng