Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Tự động hóa quá trình xử lý hình ảnh với tập lệnh Bash này

Nhà văn không chỉ làm việc với ngôn từ, họ thường xuyên phải làm việc với hình ảnh. Viết kỹ thuật liên quan đến việc trình bày rất nhiều ảnh 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ó các yêu cầu khác nhau đối với hình ảnh, chẳng hạn như định dạng hình ảnh hoặc kích thước tệp.

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

Giảm kích thước hình ảnh mà không làm cho chúng không thể đọc được là một bài tập nặng nhọc. Bitmap có thể được chuyển đổi thành tệp jpeg và tệp png sau này. Chỉnh sửa tiếp tục là một thách thức ngay cả sau này khi tôi chuyển bộ ứng dụng văn phòng của mình sang LibreOffice. May mắn thay, hầu hết các công cụ ảnh chụp màn hình ngày nay đều lưu ở các định dạng nhỏ hơn, chẳng hạn như png.

Opensource.com đặt ra những giới hạn nhất định đối với hình ảnh được sử dụng trong các bài báo của mình. Tôi đã phát triển một phương pháp nhanh gồm ba bước để chuẩn bị hình ảnh cho bài viết của mình. Bước đầu tiên là phải thông minh về cách sắp xếp, chẳng hạn như thay đổi kích thước cửa sổ hoặc thay đổi phông chữ. 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à có đường viền.

Tập lệnh prepimg.sh

Tôi đã viết một tập lệnh Bash có tên là prepimg.sh để xử lý các tác vụ này. Tập lệnh này sử dụng hai công cụ từ bộ ImageMagick.

Thay đổi kích thước hình ảnh

Tiện ích ảnh chụp màn hình lưu ảnh vào Pictures thư mục có tên chung — đại loại như Screenshot-20210923222312.png . prepimg.sh của tôi script 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ỳ vượt quá giới hạn. Bước này sử dụng xác định chương trình 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 để sử dụng làm bộ so sánh với giới hạn 600. Bản thân giới hạn có thể được định cấu hình thông qua biến $MAXWIDTH . Nếu chiều rộng được xác định là vượt quá MAXWIDTH, thì một chương trình ImageMagick khác có tên là chuyển đổi được gọi để giảm chiều rộng của hình ảnh. Đây là chức năng xử lý hình ảnh từ tập lệnh 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 khi cần thiết và được lưu vào một thư mục khác được xác định bởi $READY Biến đổi. Trong trường hợp này, hình ảnh thực sự được thay đổi kích thước nhỏ hơn một chút — 598 pixel — để có chỗ cho việc thêm đường viền mà tôi sẽ hiển thị tiếp theo.

Thêm đường viền vào hình ảnh

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

Tự động hóa quá trình xử lý hình ảnh với tập lệnh Bash này Hình ảnh của:

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

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

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

Dưới đây là hình ảnh tương tự với một đường viền. Trông có đẹp hơn không?

Tự động hóa quá trình xử lý hình ảnh với tập lệnh Bash này Hình ảnh của:

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

Hình ảnh của bạn đã sẵn sàng

Tôi sử dụng for vòng lặp để lặp qua thư mục ảnh 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à đường viền. Mã đầy đủ thực hiện một số kiểm tra tính minh mẫn, chẳng hạn như đảm bảo tệp thực sự là một 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ùng của tập lệnh là lưu các tệp đã xử lý trong một thư mục con có tên là Ready , được xác định bởi biến có tên $READY . Điều này bảo tồn các tệp gốc để sử dụng thêm.

Cách sử dụng

Prepimg.sh bao gồm cơ sở trợ giúp mong đợi mô tả các đối số của nó và cách sử dụng chú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ã được trình bày trong bài viết không đầy đủ và nên được coi là mã giả. Bạn có thể xem toàn bộ tập lệnh trong kho lưu trữ Git của tôi.

Bộ ImageMagick là một bộ công cụ mạnh mẽ để xử lý hình ảnh. Bạn có thể làm nhiều việc khác ngoài các chức năng được tích hợp trong tập lệnh nhỏ của tôi. Phóng viên Jim Hall gần đây cũng đã viết về việc sử dụng nó để thay đổi kích thước hình ảnh.

Cho dù bạn thích viết mã Bash hay viết mã bằng ngôn ngữ khác như C hoặc Python, thì tự động hóa là một trợ giúp tuyệt vời. Hết lần này đến lần khác, tôi đã thấy một chút mã có thể làm giảm quá nhiều vấn đề đau đầu và cho phép chúng tôi sử dụng thời gian của mình tốt hơn.