Trước đây mình thường tối ưu hóa hình ảnh bằng các công cụ trên máy tính trước khi upload lên, nhưng có vẻ hơi mất thời gian và công sức. Vì thế mình đã cố gắng tìm các công cụ để làm công việc này một cách tự động trên server, nhằm tiết kiệm một chút thời gian dành cho việc khác (quay tay chẳng hạn ).
Hiện nay có khá nhiều công cụ để tối ưu hóa hình ảnh trên CentOS, về chức năng và độ nén của chúng không có quá nhiều khác biệt. Nên trong bài viết này mình chỉ giới thiệu với các bạn 2 công cụ được nhiều người sử dụng nhất, đó là:
- JpegOptim dùng để tối ưu hóa các hình ảnh JPEG (.jpg, .jpeg, .jpe .jif, .jfif, .jfi).
- OptiPNG dùng để tối ưu hóa ảnh PNG.
1. Cài đặt
A. Centos
Vì JpegOptim và OptiPNG không có sẵn trong repo mặc định của CentOS, nên trước tiên bạn cần phải cài đặt thêm 2 repo: EPEL và RPMForge. Trong bài Cài đặt nginx, PHP 5.3, MySQL (LEMP) trên CentOS 6.x mình đã nói về 2 repo này rồi nên xin phép copy luôn từ bài đó:
Dùng lệnh wget
để tải về, và cài đặt bằng lệnh rpm -ivh
:
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm rpm -ivh epel-release-6-8.noarch.rpm rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
Sau khi cài xong repo, bây giờ bạn mới có thể cài jpegoptim và optipng:
yum install jpegoptim optipng
B. Ubuntu
2. Cách sử dụng
Bây giờ chúng ta hãy cùng tìm hiểu về cách sử dụng của 2 công cụ tối ưu hóa hình ảnh này.
Tối ưu hóa JPEG bằng JpegOptim
Đây là lệnh cơ bản của JpegOptim, nó chỉ có tác dụng trên thư mục đang thực thi lệnh này mà thôi:
jpegoptim *.jpg --max=80 --strip-all -p
Trong đó --max
là chất lượng hình ảnh (từ 1-100
) xuất ra, --strip-all
là xóa bỏ các thông tin kèm theo như địa điểm chụp, tên camera, khẩu độ, tiêu cự của lens… -p
là giữ thời gian sửa đổi cuối (modification time) giống như ảnh gốc. Xem thêm cách dùng bằng lệnh jpegoptim
-h.
Lệnh sau sẽ tìm tất cả những file .jpg có trong thư mục được chỉ định (bao gồm cả thư mục con) và thực hiện tối ưu lần lượt cho đến hết:
find /thu/muc/anh/ -iname *.jpg -exec jpegoptim --max=80 --strip-all -p {} \;
Thử nghiệm thực tế: ảnh gốc xuất ra từ Photoshop với chất lượng = 100, mình thử nghiệm với 3 mức sau để các bạn tham khảo (mình khuyên chọn mức 80 là OK nhất):
--max=50
: hình ảnh trông rất tệ, dung lượng giảm khoảng 80%.--max=80
: hình ảnh trông khá ổn, dung lượng giảm khoảng 70%.--max=90
: hình ảnh đẹp không khác ảnh gốc là mấy, dung lượng giảm khoảng 60%.
Tối ưu hóa PNG bằng OptiPNG
Tương tự, lệnh cơ bản của OptiPNG:
optipng *.png -o7 -preserve
Trong đó -o7
là mức độ nén được chọn (từ -o1
đến -o7
), -preserve
là giữ thời gian sửa đổi (modification time) giống như ảnh gốc.
Lệnh sau sẽ tìm tất cả những file .png có trong thư mục được chỉ định (bao gồm cả thư mục con) và thực hiện tối ưu lần lượt cho đến hết:
find /thu/muc/anh/ -iname *.png -exec optipng -o7 -preserve {} \;
Đối với ảnh PNG thì mình luôn chọn mức độ nén cao nhất đó là -o7
, bởi vì do đặc tính của ảnh PNG nên chất lượng ảnh sau nén gần như không thay đổi. Cũng vì lý do này nên ảnh PNG không thể nén mạnh như ảnhJPEG, và thời gian nén thì lâu hơn nhiều.
Ngoài ra OptiPNG cũng có thể tối ưu những hình ảnh không thuộc dạng PNG, và xuất ra file .png.
3. Tự động hóa bằng Cron job
Cron job (hay crontab) là một dịch vụ hỗ trợ chạy những lệnh trên CentOS một cách tự động tại một thời điểm đã chọn, ví dụ như 5 phút 1 lần, mỗi giờ… Vì thế đưa những lệnh trên vào cron job sẽ giúp việc tối ưu hóa hình ảnh của bạn trở nên đơn giản hơn bao giờ hết, gần như bạn không cần quan tâm đến nó nữa. Dùng lệnh sau để sửa crontab:
crontab -e
Copy các lệnh sau và dán vào:
@weekly find /thu/muc/anh/ -mtime -7 -iname *.jpg -exec jpegoptim --max=80 --strip-all -p {} \; > /dev/null @weekly find /thu/muc/anh/ -mtime -7 -iname *.png -exec optipng -o7 -preserve {} \; > /dev/null
Ấn phím ESC, và gõ vào :wq
rồi ấn phím Enter để thoát khỏi trình sửa cron job.
Cron job trên sẽ tự động chạy jpegoptim, optipng một lần/tuần vào ngày Chủ nhật @weekly
, và chỉ tối ưu những hình ảnh mới upload trong 7 ngày gần nhất -mtime -7
. Mình đưa vào tùy chọn này để tránh trường hợp tối ưu lại những hình ảnh đã được tối ưu trước đó rồi, nó không cần thiết và cũng làm mất đi một lượng tài nguyên (CPU, RAM) của server.
From: Blog Sáu Ngón