BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

このBashスクリプトを使用して画像処理を自動化する

作家は言葉だけでなく、画像を扱う必要があります。テクニカルライティングでは、テクノロジーとプロセスを伝えるために多くのスクリーンショットを提示します。公開プラットフォームが異なれば、画像の形式やファイルサイズなど、画像に関するさまざまな要件があります。

ITコンサルタントおよびシステムエンジニアとして、私はクライアントの成果物として多くの技術文書を作成しました。通常、必要な形式はMicrosoft Word(.doc)です。コンテンツが追加されると、どのドキュメントも急速に成長する可能性があります。初期のスクリーンショットはビットマップ(.bmp)であることが多く、ファイルサイズが非常に大きくなる可能性がありました。サーバーへのオペレーティングシステムのインストールを説明するドキュメントは、非常に大きなファイルになる可能性があります。

画像を判読不能にせずにダウンサイジングするのは骨の折れる作業でした。ビットマップは、jpegファイルおよびそれ以降のpngファイルに変換できます。その後、オフィススイートをLibreOfficeに切り替えたときも、編集は引き続き困難でした。幸い、今日のほとんどのスクリーンショットツールは、pngなどの小さな形式で保存されます。

Opensource.comは、記事で使用される画像に一定の制限を設けています。私は自分の記事の画像を準備するための迅速な3ステップの方法を開発しました。最初のステップは、ウィンドウのサイズ変更やフォントの変更など、ステージングについて賢くすることです。 2つの追加ステップが非常に繰り返されました。これらは、画像が600ピクセルの幅の制限を超えないようにし、境界線を適用するためのものです。

prepimg.shスクリプト

prepimg.shというBashスクリプトを作成しました これらのタスクを処理します。このスクリプトは、ImageMagickスイートの2つのツールを使用しています。

画像のサイズを変更

スクリーンショットユーティリティは、画像をPicturesに保存します 一般的な名前のディレクトリ— Screenshot-20210923222312.pngのようなもの 。私のprepimg.sh スクリプトは、このディレクトリ内のファイルのピクセル幅をチェックし、制限を超えるファイルのサイズを変更します。このステップでは、識別を使用します 幅(%w)を決定するためのImageMagickスイートからのプログラム。

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

幅の値は変数Wに割り当てられます 600の制限までのコンパレータとして使用します。制限自体は、変数$MAXWIDTHを介して構成できます。 。幅がMAXWIDTHを超えると判断された場合は、 convertという名前の別のImageMagickプログラム 画像の幅を狭くするために呼び出されます。これが私のスクリプトの画像処理機能です:

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

画像は必要に応じてサイズが縮小され、$READYで定義された別のディレクトリに保存されます 変数。この場合、画像のサイズは実際にはわずかに小さく(598ピクセル)、次に示す境界線を追加する余地があります。

画像に境界線を追加

画像がWebページの背景に溶け込んでいるように見える場合があります。これは、画像の端までの前景色がサイトの背景と同じ色であるためです。次に例を示します:

このBashスクリプトを使用して画像処理を自動化する 画像:

境界線のない画像。 (CC BY-SA 4.0)

上の画像でわかるように、画像の端がどこにあるかを知ることは不可能です。この問題は、白色に限定されません。個々のサイトとそれが使用するテーマの色によって異なります。したがって、背景が赤で、画像の端も赤の場合、これと同じ問題が発生します。私のスクリプトは、変換を使用してこれを解決します 道具。 -border オプションは、1ピクセルのサイズで各画像ファイルに境界線を追加します。このオプションだけで十分ですが、 -bordercolorを使用して色を設定したいと思います。 オプション。次に例を示します:

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

以下は、境界線のある同じ画像です。見栄えが良くないですか?

このBashスクリプトを使用して画像処理を自動化する 画像:

境界線のある画像。 (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)

コードと結論

この記事に示されているコードは不完全であり、擬似コードと見なす必要があります。完全なスクリプトは私のGitリポジトリで表示できます。

ImageMagickスイートは、画像を操作するための強力なツールセットです。私の小さなスクリプトに組み込まれている機能に加えて、さらに多くのことができます。特派員のジム・ホールも最近、画像のサイズ変更に使用することについて書いています。

Bashスクリプトを使用する場合でも、CやPythonなどの別の言語でコーディングする場合でも、自動化は非常に役立ちます。少しのコードで多くの頭痛の種を減らし、時間を有効に活用できるようになることを何度も見てきました。


  1. この単純なBashスクリプトを使用して、自宅で両面ドキュメントを印刷します

    自宅にレーザープリンターがあります。このHewlettPackardLaserJet Pro CP1525nwカラープリンターは古いモデルですが、確実にカラーで印刷できる優れた主力製品です。数年前に、RaspberryPiをプリントサーバーとして使用してホームネットワークに配置しました。 LaserJetは、私のホームオフィスに追加された素晴らしい機能です。昨年会社を立ち上げて以来、この小さなレーザープリンターを利用して、クライアントの会議、ワークショップ、トレーニングセッション用の配布物やその他の資料を印刷してきました。 このプリンターの唯一の不満は、片面のみを印刷することです。両面

  2. 5 つの実用的な例を含む Bash スクリプト入門チュートリアル

    進行中の Unix Sed および Unix Awk シリーズと同様に、Bash スクリプトに関するいくつかの記事を投稿します。実用的な例ですべての bash スクリプト テクニックをカバーします。 シェルは、ユーザー コマンドを解釈するプログラムです。コマンドは、ユーザーが直接入力するか、シェル スクリプトと呼ばれるファイルから読み取るかのいずれかです。ユーザーからの入力を直接読み取る場合、シェルは対話型シェルとして呼び出されます。 シェルは、ファイルからコマンドを読み取って実行するときに、非対話型シェルとして呼び出されます。この場合、シェルはスクリプト ファイルの各行を上から下に読み取