কম্পিউটার টিউটোরিয়াল

Bash অটোমেশন স্ক্রিপ্ট দিয়ে ইমেজ অপ্টিমাইজেশন স্ট্রিমলাইন করুন

লেখকরা শুধু শব্দের সাথে কাজ করে না, তারা প্রায়শই ইমেজের সাথে কাজ করতে হয়। টেকনিক্যাল রাইটিং-এ টেকনোলজি এবং প্রসেস বোঝাতে অনেক স্ক্রিনশট প্রেজেন্ট করতে হয়। বিভিন্ন পাবলিশিং প্ল্যাটফর্মের ইমেজের জন্য বিভিন্ন রিকোয়ারমেন্ট থাকতে পারে, যেমন ইমেজ ফরম্যাট বা ফাইল সাইজ।

একজন IT কনসাল্টেন্ট এবং সিস্টেমস ইঞ্জিনিয়ার হিসেবে, আমি অনেক টেকনিক্যাল ডকুমেন্টেশন লিখেছি ক্লায়েন্ট ডেলিভারেবল হিসেবে, সাধারণত Microsoft Word (.doc) রিকোয়ার্ড ফরম্যাট হিসেবে। যেকোনো ডকুমেন্ট কন্টেন্ট যোগ হওয়ার সাথে সাথে দ্রুত বড় হতে পারে। প্রারম্ভিক দিনে, স্ক্রিনশটগুলো প্রায়শই বিটম্যাপ (.bmp) হয়ত, যেগুলোর ফাইল সাইজ খুব বড় হতে পারে। একটি সার্ভারে অপারেটিং সিস্টেম ইনস্টলেশনের বর্ণনা করা একটি ডকুমেন্ট খুব বড় ফাইল হতে পারে।

ইমেজগুলো রিডিউস করা যাতে সেগুলো অনরিডেবল না হয় একটি শ্রমসাধ্য এক্সারসাইজ ছিল। বিটম্যাপগুলো জেপেগ ফাইলে কনভার্ট করা হতো এবং পরে পিএনজি ফাইলে। এডিটিং চ্যালেঞ্জিং থাকলো পরবর্তীতে যখন আমি আমার অফিস সুইট LibreOffice-এ সুইচ করলাম। خوشখবর, আজকাল অধিকাংশ স্ক্রিনশট টুল ছোট ফরম্যাটে সেভ করে, যেমন png।

Opensource.com তার আর্টিকেলে ব্যবহৃত ইমেজের জন্য সিমা নির্দিষ্ট করে। আমি আমার আর্টিকেলের জন্য ইমেজ প্রিপেয়ার করার জন্য একটি কুইক থ্রি-স্টেপ মেথড ডেভেলপ করেছি। প্রথম ধাপ হলো স্টেজিং সম্পর্কে স্মার্ট হওয়া, যেমন উইন্ডো রিসাইজ করা বা ফন্ট চেঞ্জ করা। দুটি অতিরিক্ত ধাপ খুব রিপিটেটিভ হয়ে গেল। সেগুলো হলো ইমেজ ৬০০ পিক্সেল প্রস্থের সীমা অতিক্রম করে না তা নিশ্চিত করা এবং একটি বর্ডার অ্যাপ্লাই করা।

prepimg.sh স্ক্রিপ্ট

আমি prepimg.sh নামে একটি Bash স্ক্রিপ্ট লিখেছি এই টাস্কগুলো হ্যান্ডেল করার জন্য। এই স্ক্রিপ্ট ImageMagick স্যুট থেকে দুটি টুল ব্যবহার করে।

ইমেজ রিসাইজ করা

স্ক্রিনশট ইউটিলিটি ইমেজটি Pictures ডিরেক্টরিতে জেনেরিক নাম দিয়ে সেভ করে—কিছু এমন Screenshot-20210923222312.png। আমার prepimg.sh স্ক্রিপ্ট এই ডিরেক্টরিতে থাকা ফাইলগুলোর পিক্সেল প্রস্থ চেক করে এবং যেসব সীমা অতিক্রম করে সেগুলো রিসাইজ করে। এই ধাপটি ImageMagick স্যুট থেকে identify প্রোগ্রাম ব্যবহার করে প্রস্থ (%w) নির্ধারণ করতে।

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

প্রস্থের মান W ভেরিয়েবলে অ্যাসাইন করা হয় ৬০০ লিমিটের সাথে কমপারেটর হিসেবে ব্যবহার করার জন্য। লিমিটটি কনফিগারেবল $MAXWIDTH ভেরিয়েবল ভায়া। যদি প্রস্থ লিমিট অতিক্রম করে বলে নির্ধারিত হয়, তবে ImageMagick-এর আরেকটি প্রোগ্রাম convert কল করা হয় ইমেজের প্রস্থ রিডিউস করার জন্য। এখানে আমার স্ক্রিপ্ট থেকে ইমেজ প্রসেসিং ফাংশন:

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

 ... 

ইমেজটি প্রয়োজন অনুযায়ী রিডিউস হয় এবং $READY ভেরিয়েবল দ্বারা ডিফাইন করা একটি ভিন্ন ডিরেক্টরিতে সেভ হয়। এই কেসে, ইমেজটি একটু ছোট রিসাইজ হয়েছে—৫৯৮ পিক্সেল—বর্ডার যোগ করার জন্য জায়গা রাখতে, যা আমি এরপর দেখাবো।

ইমেজে বর্ডার যোগ করা

কখনো কখনো একটি ইমেজ ওয়েব পেজের ব্যাকগ্রাউন্ডের সাথে ব্লেন্ড হয়ে যেতে পারে। এর কারণ হলো ইমেজের ফোরগ্রাউন্ড কালার এর এজ পর্যন্ত সাইটের ব্যাকগ্রাউন্ডের মতো একই রঙ। এখানে একটি উদাহরণ:

Bash অটোমেশন স্ক্রিপ্ট দিয়ে ইমেজ অপ্টিমাইজেশন স্ট্রিমলাইন করুন Image by:

বর্ডার ছাড়া একটি ইমেজ। (CC BY-SA 4.0)

উপরের ইমেজে দেখতে পাচ্ছেন, ইমেজের এজ কোথায় বোঝা যাচ্ছে না। এই সমস্যা শুধু সাদা রঙের জন্য নয়। এটি প্রতিটি সাইট এবং সেটি যেস থিম কালার ব্যবহার করে তার ওপর ডিপেন্ড করে। তাই, যদি ব্যাকগ্রাউন্ড লাল হয় এবং ইমেজের এজও লাল হয়, তবে একই সমস্যা হয়। আমার স্ক্রিপ্টটি convert টুল ব্যবহার করে এটা সমাধান করে। -border অপশনটি প্রতিটি ইমেজ ফাইলে ১ পিক্সেল সাইজের একটি বর্ডার যোগ করে। শুধু এই অপশনই যথেষ্ট হতো কিন্তু আমি কালারও সেট করতে চাই -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-এ আশা করা হেল্প ফ্যাসিলিটি রয়েছে যা এর আর্গুমেন্ট এবং তাদের ব্যবহার বর্ণনা করে:

$ 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 রিপোজিটোরিয়ে ফুল স্ক্রিপ্টটি দেখতে পারেন।

ImageMagick স্যুট ইমেজ ম্যানিপুলেশনের জন্য একটি পাওয়ারফুল টুল সেট। আমার ছোট স্ক্রিপ্টে অন্তর্ভুক্ত ফাংশনগুলোর পাশাপাশি আপনি আরও অনেক কিছু করতে পারেন। করেসপন্ডেন্ট Jim Hallও সম্প্রতি এটা ব্যবহার করে ইমেজ রিসাইজ করার কথা লিখেছেন।

আপনি Bash স্ক্রিপ্টিং পছন্দ করেন বা C বা Python-এ কোডিং, অটোমেশন একটি বড় সাহায্য। বার বার আমি দেখেছি কীভাবে একটু কোড এতগুলো মাথাব্যাথা কমাতে পারে এবং আমাদের সময় আরও ভালো ব্যবহার করতে দিতে পারে।

  1. পहेলি-ভিত্তিক শিক্ষণ দ্বারা ব্যাশ দক্ষতা 습득 করুন

  2. লিনাক্সে স্টারগেজিংয়ের সময় রাত্রি দৃষ্টি রক্ষার জন্য ব্যাশ স্ক্রিপ্ট

  3. সহজে ঘরে ডাবল-সাইডেড ডকুমেন্ট প্রিন্ট করুন একটি সাধারণ ব্যাশ স্ক্রিপ্ট দিয়ে

  4. ব্যাশ স্ক্রিপ্টিং মাস্টার করুন: ৫টি রিয়েল-ওয়ার্ল্ড উদাহরণসহ প্র্যাক্টিক্যাল ইন্ট্রোডাকশন