Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Tối Ưu Hóa Hình Ảnh Với Script Tự Động Hóa Bash

Người viết không chỉ làm việc với chữ, họ thường phải làm việc với hình ảnh. Viết kỹ thuật liên quan đến trình bày nhiều chụp màn hình để truyền đạt công nghệ và quy trình. Các nền tảng xuất bản khác nhau có thể có yêu cầu khác nhau cho hình ảnh, như định dạng hình ảnh hoặc kích thước tệp.

Là một tư vấn viên IT và kỹ sư hệ thống, tôi đã viết nhiều tài liệu kỹ thuật làm deliverable cho khách hàng, thường với Microsoft Word (.doc) làm định dạng yêu cầu. Bất kỳ tài liệu nào cũng có thể tăng nhanh khi thêm nội dung. Trong những ngày đầu, chụp màn hình thường là bitmap (.bmp), có kích thước tệp rất lớn. Tài liệu mô tả cài đặt hệ điều hành lên máy chủ có thể trở thành tệp rất lớn.

Giảm kích thước hình ảnh mà không làm chúng trở nên khó đọc là bài tập vất vả. Bitmap có thể chuyển thành file jpeg và sau này png. Việc chỉnh sửa tiếp tục là thách thức ngay cả sau khi tôi chuyển bộ辦公 sang LibreOffice. May mắn thay, hầu hết công cụ chụp màn hình hiện nay lưu ở định dạng nhỏ hơn, như png.

Opensource.com đặt một số giới hạn cho hình ảnh dùng trong bài viết. Tôi phát triển một phương pháp ba bước nhanh cho việc chuẩn bị hình ảnh cho bài viết. Bước đầu tiên là thông minh về việc dàn trang, như thay đổi kích thước cửa sổ hoặc đổi font. Hai bước bổ sung trở nên rất lặp lại. Đó là đảm bảo hình ảnh không vượt quá giới hạn chiều rộng 600 pixel và thêm viền.

Script prepimg.sh

Tôi viết một script Bash tên prepimg.sh để xử lý các tác vụ này. Script này dùng hai công cụ từ bộ ImageMagick.

Thay Đổi Kích Thước Hình Ảnh

Tiện ích chụp màn hình lưu hình ảnh vào thư mục Pictures với tên chung – kiểu như Screenshot-20210923222312.png. Script prepimg.sh của tôi kiểm tra chiều rộng pixel của các tệp trong thư mục này và thay đổi kích thước bất kỳ cái nào vượt quá giới hạn. Bước này dùng chương trình identify từ bộ ImageMagick để xác định chiều rộng (%w).

$ identify -format %w Screenshot-20210903202655.png
1217

Giá trị chiều rộng được gán cho biến W để dùng làm bộ so sánh với giới hạn 600. Giới hạn bản thân có thể cấu hình qua biến $MAXWIDTH. Nếu chiều rộng được xác định vượt quá MAXWIDTH, thì chương trình ImageMagick khác tên convert được gọi để giảm chiều rộng hình ảnh. Đây là hàm xử lý hình ảnh từ script của tôi:

if [ "$W" -gt "$MAXWIDTH" ]
then
[[ $VERBOSE -gt 0 ]] && echo "${1} is ${W} - reducing"
convert -resize "${MAXWIDTH}" \
"${SCREENSHOTS}"/"${1}" \
"${READY}"/"${1}"

... 

Hình ảnh được giảm kích thước theo cần thiết và lưu vào thư mục khác được định nghĩa bởi biến $READY. Trong trường hợp này, hình ảnh thực sự được resize nhỏ hơn một chút – 598 pixel – để chừa chỗ cho việc thêm viền, mà tôi sẽ chỉ tiếp theo.

Thêm Viền Cho Hình Ảnh

Đôi khi hình ảnh có thể xuất hiện như hòa lẫn vào nền của trang web. Điều này vì màu nền trước của hình ảnh ra đến cạnh là cùng màu với nền của trang. Đây là ví dụ:

Tối Ưu Hóa Hình Ảnh Với Script Tự Động Hóa Bash Hình ảnh bởi:

Hình ảnh không có viền. (CC BY-SA 4.0)

Như bạn thấy với hình ảnh trên, không thể phân biệt đâu là cạnh của hình ảnh. Vấn đề này không giới hạn ở màu trắng. Nó phụ thuộc vào từng trang và màu chủ đề nó dùng. Vì vậy, nếu nền đỏ và cạnh hình ảnh cũng đỏ, cùng vấn đề xảy ra. Script của tôi giải quyết điều này bằng cách dùng công cụ convert. Tùy chọn -border thêm viền cho mỗi tệp hình ảnh với kích thước 1 pixel. Tùy chọn này bản thân đã đủ nhưng tôi cũng muốn đặt màu bằng tùy chọn -bordercolor. Đây là ví dụ:

convert -bordercolor black -border 1 Screenshot-20210903202655.png

Dưới đây là cùng hình ảnh có viền. Có đẹp hơn không?

Tối Ưu Hóa Hình Ảnh Với Script Tự Động Hóa Bash Hình ảnh bởi:

Hình ảnh có viền. (CC BY-SA 4.0)

Hình Ảnh Của Bạn Đã Sẵn Sàng

Tôi dùng vòng lặp for để lặp qua thư mục chụp màn hình. Nó gọi hàm process_img cho mỗi tệp. Hàm xử lý cả chiều rộng và viền. Mã đầy đủ làm một số kiểm tra an toàn như đảm bảo tệp thực sự là hình ảnh.

process_img() {
# verify that file is an image file, and then get dimensions
if file "${SCREENSHOTS}"/"${1}" | grep -qE 'image|bitmap'; then
[[ $VERBOSE -gt 0 ]] && echo "${1} is an image"
W=$(identify -format %w "${SCREENSHOTS}"/"${1}")
else
echo "File ${SCREENSHOTS}/${1} is not an image."
W=0
fi

# resize and border
if [ "$W" -gt "$MAXWIDTH" ]
then
[[ $VERBOSE -gt 0 ]] && echo "${1} is ${W} - reducing"
convert -resize "${MAXWIDTH}" \
-bordercolor $BORDER \
-border 1 \
"${SCREENSHOTS}"/"${1}" \
"${READY}"/"${1}"
else
convert -bordercolor $BORDER \
-border 1 \
"${SCREENSHOTS}"/"${1}" \
"${READY}"/"${1}"
fi
}

Bước cuối của script là lưu các tệp đã xử lý trong thư mục con tên Ready, được xác định bởi biến tên $READY. Điều này bảo toàn các tệp gốc để dùng thêm.

Cách Dùng

Prepimg.sh bao gồm tiện ích trợ giúp dự kiến mô tả các đối số và cách dùng:

$ prepimg.sh -h
prepimg.sh Version 0.7 - written by Alan Formy-Duval
prepimg.sh [OPTIONS]
--verbose, -v Be verbose
--directory, -d Screenshot directory (default: /home/alan/Pictures/Screenshots)
--ready, -r Ready directory (default: /home/alan/Pictures/Screenshots/Ready)
--border, -b Border color (default: black)

Mã Và Kết Luận

Mã trình bày trong bài viết không hoàn chỉnh và nên được coi là pseudocode. Bạn có thể xem script hoàn chỉnh trong kho Git của tôi.

Bộ ImageMagick là một tập hợp công cụ mạnh mẽ để thao tác hình ảnh. Bạn có thể làm nhiều việc hơn ngoài các chức năng tích hợp trong script nhỏ của tôi. phóng viên Jim Hall cũng gần đây viết về việc dùng nó để resize hình ảnh.

Dù bạn thích script Bash hay lập trình ngôn ngữ khác như C hoặc Python, tự động hóa là sự giúp đỡ lớn. Lần sau lần, tôi đã thấy một chút mã có thể giảm bớt nhiều đau đầu và cho phép chúng ta dùng tốt hơn thời gian của mình.