slimg - CLI tối ưu hóa hình ảnh viết bằng Rust (54GB → 8GB)
(github.com/clroot)Vì sao lại tạo ra nó?
Tôi thường xuyên dùng công cụ Squoosh của Google, nhưng bản CLI thì chạy là lỗi, còn bản web thì dùng cũng ổn nhưng... cuối cùng vì kiểu bị bỏ mặc đặc trưng của Google nên tôi quyết định tự làm. Tôi cũng đã tìm các giải pháp thay thế nhưng không có cái nào thật sự vừa ý.
slimg là gì?
Đây là một CLI tối ưu hóa hình ảnh được viết bằng Rust. Nó hỗ trợ chuyển đổi giữa JPEG, WebP, PNG, AVIF, QOI, cùng với thay đổi kích thước và tối ưu chất lượng. Công cụ sử dụng các codec hiện đại như MozJPEG, OxiPNG và ravif.
Kết quả sử dụng thực tế:
Tôi đã tối ưu hóa hàng loạt 54GB ảnh cá nhân và giảm xuống còn 8GB. (giảm 85%) Chất lượng ở mức gần như không thể nhận ra sự khác biệt bằng mắt thường.
# Xử lý hàng loạt thư mục (song song)
slimg convert ./photos --format webp --quality 85 --recursive
# Thay đổi kích thước + chuyển đổi
slimg resize photo.jpg --width 800 --format avif --quality 70
Đặc điểm kỹ thuật:
- Xử lý song song trên mọi lõi CPU bằng Rayon
- Ghi đè an toàn bằng file tạm → atomic rename
- Tách thư viện (
slimg-core) và CLI (có thể tái sử dụng) - Hiệu năng native nhờ binding codec C
Cài đặt:
brew install clroot/tap/slimg
# https://github.com/clroot/slimg/releases
GitHub: https://github.com/clroot/slimg
7 bình luận
Đã bổ sung binding Kotlin cho slimg. Có thể xử lý hình ảnh trên server/backend một cách dễ dàng.
Tôi cũng đã tạo bằng LLM một công cụ để xóa nền khỏi các tệp được tạo dưới dạng png, rồi chuyển sang svg nhằm giảm dung lượng mà vẫn giữ chất lượng. Tôi làm bằng rust, và phần chuyển sang svg hoạt động rất tốt, nhưng để giảm dung lượng của svg thì rốt cuộc tôi vẫn buộc phải dùng chương trình tên là svgo. svgo rất xuất sắc trong việc cắt giảm những đoạn mã không cần thiết trong svg, nhưng đây có vẻ là phần đòi hỏi kiến thức chuyên môn theo lĩnh vực, nên tôi đã tận dụng svgo.
Nhưng tôi lại chưa từng nghĩ đến việc dùng các codec hiện đại như MozJPEG, OxiPNG hay ravif. Giờ tôi cũng muốn thử một lần. Cảm ơn bạn đã truyền cảm hứng.
Tôi vốn đang dùng SalOne22/rimage, nên chắc phải xem thử cái này thế nào. Trước mắt, việc cung cấp Python binding có vẻ là một ưu điểm.
Đã bổ sung cả Python binding cho slimg.
Tôi cũng đang tự viết bằng Rust một công cụ chuyển đổi hàng loạt các ảnh được gói trong file nén để dùng, nên có lẽ tôi sẽ thử đổi phần gọi nội bộ sang repository này.
Nhân tiện, việc giải mã AVIF chỉ khả dụng trên macOS có phải là vì một lý do cụ thể nào đó không?
Giờ đây nếu bạn dùng phiên bản 0.1.3, bạn cũng có thể giải mã AVIF trên Windows và Linux.
Điều này là do phiên bản thư viện xử lý avif không tương thích trong môi trường GitHub Actions được dùng để build. Chúng tôi dự định sẽ sớm chỉnh sửa môi trường build để hỗ trợ avif cả trên máy Linux.