雲の向こうの空

立ち上る雲の向こうの空 いかん
見上げしもののあわれとぞ思ふ

ノーチラスのスクリプト

2020年09月27日 | CPU


waifu2x-converter-cpp で圧縮により劣化した画像ファイルを綺麗にすることができますが、コマンドを打ち込むのは面倒なので、Ubuntu の nautilus のプルダウンメニューからコンバートできるようにシェルスクリプトを書いてみました。



waifu2x-converter-cpp にはいくつかの種類があるようですが、nagadomiさんのものを使用させていただいています。



次に nautilus で使用する シェルスクリプト(bash) を紹介します。



#!/bin/bash

exstr=_waifu2x

# 引数に複数のファイルが渡されている場合
# コンバートの実行を確認
if [ $# -gt 1 ]; then
zenity --question --no-wrap --title="確認" --text="$#個 のファイルを処理します"
if [ $? -ne 0 ]; then
exit 1
fi
fi

# ノイズ除去レベルを設定
#nois=$(zenity --entry \
#--title="ノイズ除去レベル" \
#--text="ノイズ除去レベルを入力してください:" \
#--entry-text "2")

nois=$(zenity --list \
--title="ノイズ除去レベル" \
--text="ノイズ除去レベルを選択してください:" \
--column="ノイズ除去レベル" --column="説明" \
3 "のっぺら" 2 "普通" 1 "荒い" 0 "そのまま")

if [ $? -ne 0 ]; then
exit 1
fi

case $nois in
[0-3]) md="-m noise"
;;
*)
zenity --error --no-wrap --text="${nois}ノイズ除去レベルの設定は 0 〜 3 です"
exit 1
;;
esac

exstr=${exstr}_n${nois}

# 倍率(スケール)を設定
scal=$(zenity --entry \
--title="スケール" \
--text="スケールを入力してください:" \
--entry-text "1")

if [ $? -ne 0 ]; then
exit 1
fi

BC_RESULT=`echo "$scal" | bc 2>&1`

if [ $BC_RESULT == 0 ]; then
zenity --error --no-wrap --text="スケールの設定は数値です"
exit 1
elif [ $BC_RESULT == 1 ]; then
:
else
exstr=${exstr}_x${scal}
md="-m noise-scale"
fi

# 引数で渡されたファイルをループで処理
for arg
do
ifile=${arg}
ofile=`echo ${arg} | sed 's/\.[^\.]*$//'`${exstr}.png

# 処理したファイルが渡されていた場合
# スキップの確認
if [ "`echo ${ifile} | grep '_waifu2x'`" ]; then
zenity --timeout=5 --question --ellipsize \
--title="確認" --text="既に処理されているファイルです\n スキップしますか?\n${ifile}"
if [ $? -ne 1 ]; then
continue
fi
fi

# 出力ファイルが重複する場合は次のファイルを処理
if [ -f ${ofile} ]; then
zenity --notification --text="${ifile}は既にコンバートされています"
continue
fi

# ファイル形式の確認
if [ "`file ${ifile} | grep -E '(JPEG|PNG) image data'`" ]; then
:
elif [ "`file ${ifile} | grep 'Web/P image'`" ]; then
:
else
zenity --notification --text="${ifile}は対応していないファイル形式です"
continue
fi

# waifu2x-converter-cpp の実行
zenity --notification --text "${ifile}を処理します"
gnome-terminal -- waifu2x-converter-cpp ${md} --scale-ratio ${scal} --noise-level ${nois} -i ${ifile} -o ${ofile}
#waifu2x-converter-cpp -p 0 ${md} --scale-ratio ${scal} --noise-level ${nois} -i ${ifile} -o ${ofile}

# ターミナルを表示して処理をするとプロセスの終了がわからないので
# プロセスを監視
#while [ `ps -ax | grep -E "[o] ${ofile}" | wc -c` != 0 ]
while [ "`ps -ax | grep -E 'waifu[2]x-converter-cpp'`" ]
do
sleep 2
done
done

zenity --notification --text "waifu2x は完了しました"




ノイズ除去レベルと倍率を zenity で設定できるようにしました。
zenity は簡単なダイヤログを表示するためのプログラムですが、ざまざまなことができてシェルスクリプト生活を大いに改善することでしょう。



ショルスクリプトの大まかな流れは


  1. ファイルが複数選択されている場合は実行を確認

  2. ノイズ除去レベルを選択

  3. 倍率(スケール)を入力



ここからあとは引数で渡さわたファイルの処理で、ループ処理されます。



  1. 入力ファイルが既にコンバートされている場合はスキップ

  2. 出力ファイルが重複する場合はスキップ

  3. 入力ファイル形式の確認

  4. waifu2x-converter-cpp の実行



以上です。プロセスを監視してみたりとちょっと工夫してみました。こうしたらいいよというアドバイスなどありましたら、コメントにてお知らせ頂けると嬉しいです。