Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เพิ่มประสิทธิภาพการเพิ่มประสิทธิภาพภาพด้วยสคริปต์อัตโนมัติ Bash

นักเขียนไม่ได้ทำงานกับคำศัพท์เพียงอย่างเดียว พวกเขามักต้องทำงานกับรูปภาพ การเขียนเอกสารทางเทคนิคเกี่ยวข้องกับการนำเสนอสกรีนช็อตจำนวนมากเพื่อบรรยายเทคโนโลยีและกระบวนการ แพลตฟอร์มเผยแพร่ต่างๆ อาจมีข้อกำหนดต่างๆ สำหรับรูปภาพ เช่น รูปแบบไฟล์หรือขนาดไฟล์

ในฐานะที่ปรึกษา IT และวิศวกรระบบ ผมเขียนเอกสารทางเทคนิคมากมายในรูปของงานส่งมอบให้ลูกค้า โดยทั่วไปจะใช้ Microsoft Word (.doc) เป็นรูปแบบที่กำหนด เอกสารใดๆ ก็สามารถโตขึ้นเร็วเมื่อเพิ่มเนื้อหา ในช่วงแรกๆ สกรีนช็อตมักเป็น bitmap (.bmp) ซึ่งอาจมีขนาดไฟล์ใหญ่มาก เอกสารที่อธิบายการติดตั้งระบบปฏิบัติการบนเซิร์ฟเวอร์อาจกลายเป็นไฟล์ขนาดใหญ่มาก

การลดขนาดรูปภาพโดยไม่ทำให้อ่านไม่ออก เป็นการฝึกซ้อมที่ใช้แรงมาก Bitmap สามารถแปลงเป็นไฟล์ jpeg และภายหลังเป็น png ได้ การแก้ไขยังคงเป็นความท้าทายแม้หลังจากที่ผมเปลี่ยมชุดโปรแกรมสำนักงานเป็น LibreOffice โชคดีที่เครื่องมือสกรีนช็อตส่วนใหญ่วันนี้บันทึกในรูปแบบขนาดเล็กกว่า เช่น png

Opensource.com กำหนดขีดจำกัดบางอย่างสำหรับรูปภาพที่ใช้ในบทความของมัน ผมพัฒนาวิธีสามขั้นตอนอย่างรวดเร็วสำหรับเตรียมรูปภาพสำหรับบทความของผม ขั้นตอนแรกคือการจัดการ staging อย่างฉลาด เช่น ปรับขนาดหน้าต่างหรือเปลี่ยนฟอนต์ สองขั้นตอนเพิ่มเติมกลายเป็นเรื่องซ้ำซากมาก คือ การตรวจสอบว่ารูปภาพไม่เกินขีดจำกัดความกว้าง 600 พิกเซล และการเพิ่มขอบ

สคริปต์ prepimg.sh

ผมเขียนสคริปต์ Bash ชื่อ prepimg.sh เพื่อจัดการงานเหล่านี้ สคริปต์นี้ใช้เครื่องมือสองตัวจากชุด ImageMagick

ปรับขนาดรูปภาพ

ยูทิลิตี้สกรีนช็อตบันทึกรูปภาพไปยังไดเรกทอรี Pictures ด้วยชื่อทั่วไป – เหมือน Screenshot-20210923222312.png สคริปต์ prepimg.sh ของผมตรวจสอบความกว้างพิกเซลของไฟล์ในไดเรกทอรีนี้ และปรับขนาดที่เกินขีดจำกัด ขั้นตอนนี้ใช้โปรแกรม identify จากชุด ImageMagick เพื่อหาความกว้าง (%w)

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

ค่าความกว้างถูกกำหนดให้ตัวแปร W เพื่อใช้เปรียบเทียบกับขีดจำกัด 600 ขีดจำกัดนี้สามารถกำหนดได้ผ่านตัวแปร $MAXWIDTH หากความกว้างถูกกำหนดว่าเกิน MAXWIDTH โปรแกรม ImageMagick อีกตัวชื่อ convert จะถูกเรียกเพื่อลดความกว้างของรูปภาพ นี่คือฟังก์ชันประมวลผลรูปภาพจากสคริปต์ของผม:

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

 ... 

รูปภาพจะถูกลดขนาดตามที่จำเป็น และบันทึกไปยังไดเรกทอรีที่แตกต่างกันซึ่งกำหนดโดยตัวแปร $READY ในกรณีนี้ รูปภาพถูกปรับขนาดเล็กน้อย – 598 พิกเซล – เพื่อให้เหลือพื้นที่สำหรับการเพิ่มขอบ ซึ่งผมจะแสดงต่อไป

เพิ่มขอบให้รูปภาพ

บางครั้งรูปภาพอาจดูเหมือนรวมเข้ากับพื้นหลังของหน้าเว็บ เนื่องจากสีพื้นหน้าของรูปภาพจนถึงขอบมีสีเดียวกับพื้นหลังของไซต์ นี่คือตัวอย่าง:

เพิ่มประสิทธิภาพการเพิ่มประสิทธิภาพภาพด้วยสคริปต์อัตโนมัติ Bash Image by:

รูปภาพไม่มีขอบ (CC BY-SA 4.0)

ตามที่คุณเห็นกับรูปภาพข้างต้น ไม่สามารถบอกได้ว่าขอบของรูปภาพอยู่ที่ไหน ปัญหานี้ไม่ได้จำกัดเพียงสีขาว มันขึ้นอยู่กับแต่ละไซต์และสีธีมที่ใช้ ดังนั้น หากพื้นหลังเป็นสีแดงและขอบรูปภาพก็เป็นสีแดง ปัญหาเดียวกันจะเกิดขึ้น สคริปต์ของผมแก้ปัญหานี้โดยใช้เครื่องมือ convert ตัวเลือก -border เพิ่มขอบให้แต่ละไฟล์รูปภาพขนาด 1 พิกเซล ตัวเลือกนี้เพียงอย่างเดียวพอแล้ว แต่ผมอยากตั้งสีโดยใช้ตัวเลือก -bordercolor นี่คือตัวอย่าง:

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

ด้านล่างคือรูปภาพเดียวกันพร้อมขอบ ดูดีนี้ไหม?

เพิ่มประสิทธิภาพการเพิ่มประสิทธิภาพภาพด้วยสคริปต์อัตโนมัติ Bash Image by:

รูปภาพพร้อมขอบ (CC BY-SA 4.0)

รูปภาพของคุณพร้อมแล้ว

ผมใช้ลูป for เพื่อวนผ่านไดเรกทอรีสกรีนช็อต มันเรียกฟังก์ชัน process_img สำหรับแต่ละไฟล์ ฟังก์ชันนี้จัดการทั้งความกว้างและขอบ โค้ดเต็มรูปแบบทำการตรวจสอบความสมเหตุสมผล เช่น ตรวจสอบว่าไฟล์เป็นรูปภาพจริงๆ

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
 }

ขั้นตอนสุดท้ายของสคริปต์คือบันทึกไฟล์ที่ประมวลผลแล้วในซับไดเรกทอรีชื่อ Ready, ซึ่งกำหนดโดยตัวแปรชื่อ $READY สิ่งนี้เก็บไฟล์ต้นฉบับไว้สำหรับการใช้งานต่อไป

การใช้งาน

Prepimg.sh รวมสิ่งอำนวยความสะดวก help ที่คาดหวัง อธิบายอาร์กิวเมนต์และการใช้งาน:

$ 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)

โค้ดและสรุป

โค้ดที่นำเสนอในบทความนี้ไม่สมบูรณ์ และควรถือว่าเป็น pseudocode คุณสามารถดูสคริปต์เต็มรูปแบบใน Git repository ของผม

ชุด ImageMagick เป็นชุดเครื่องมืออันทรงพลังสำหรับจัดการรูปภาพ คุณสามารถทำอะไรได้อีกมากมายนอกเหนือจากฟังก์ชันที่รวมอยู่ในสคริปต์เล็กๆ ของผม ผู้สื่อข่าว Jim Hall ก็เพิ่งเขียนเกี่ยวกับการใช้มันปรับขนาดรูปภาพเมื่อไม่กี่วันก่อน

ไม่ว่าคุณจะชอบ Bash scripting หรือเขียนโค้ดในภาษาอื่น เช่น C หรือ Python การทำอัตโนมัติเป็นความช่วยเหลือที่ยิ่งใหญ่ ครั้งหลังครั้ง ผมเห็นว่ารหัสเล็กน้อยสามารถลดปวดหัวมากมาย และช่วยให้เราใช้เวลาของเราได้อย่างมีประสิทธิภาพมากขึ้น