Linux では、画像処理を行うライブラリとして ImageMagick というライブラリが様々なソフト、言語で 使われいます。ImageMagick には、画像を表示する display、アニメーション表示させる anmite、 画像の加工を行う convert コマンドなどが含まれています。特に convert コマンドは画像加工を行いたい時、有効なコマンドです。
$ sudo apt-get install imagemagick
以下にいくつか、convert コマンドの使用法を紹介します。
jpeg ファイルを png ファイルに変換する
$ convert input.jpg output.png
画像のサイズを 50% にする。
$ convert -resize 50% input.jpg output.jpg
画像の圧縮率を30%にする。
$ convert -quality 30% input.jpg output.jpg
画像を90度回転する。
$ convert -rotate 90 input.png output.png
画像をグレースケール(モノクロ写真)へ変換する。
$ convert -type GrayScale input.jpg output.jpg
画像をセピア調画像へ変換する。
$ convert -sepia-tone 80% input.jpg output.jpg
convert コマンドは、画像ファイルのみを扱えると思いがちですが、画像ファイルをまとめてPDFを作成したり、 PDF から画像ファイルを抽出したりする事ができます。
$ convert input.pdf output.jpg
$ ls output-*
output-0.jpg output-1.jpg output-2.jpg output-3.jpg ... output-10.jpg output-11.jpg
$ convert input*.jpg output.pdf
しかし、画像ファイルをPDFにする場合、ファイル名でソートすると output-0.jpg output-1.jpg output-10.jpg output-11.jpg output-2.jpg という並びになってしまう。そんな時は、ls の -v (バージョン番号順) オプションでソートを行い実行する事も可能だが、 桁数を揃えた方が見栄えが良いので、[jpeg2pdf.sh input*.jpg output.pdf] と実行する事により ファイル名の桁数変更後、PDF化するスクリプトを作ってみました。
$ convert `ls -v input*.jpg` output.pdf
$ jpeg2pdf.sh input*.jpg output.pdf
#!/bin/bash
# convert `ls -v *.jpg ` /tmp/out.pdf
# 改行をデリミタとして扱う
IFS="
"
# 最後のパラメータを出力PDF名とする
PDFFILE="${@:$#:1}";
if [ $# -lt 2 ] && [ "`echo \"${PDFFILE}\" |grep -qs pdf$`" != "0" ]; then
echo "Usage: $0 ImageFileList PDFFileName";
exit -1;
fi
FILELIST='';
for FILENAME in "${@}"
do
# 最後のパラメータまで到達したのでループを抜ける
if [ "${FILENAME}" == "${PDFFILE}" ]; then
break;
fi
# ファイルが存在しない場合は、次のループへ
if [ ! -f "${FILENAME}" ]; then
continue;
fi
# ファイル名に含まれている数字の文字列を取得
FILENO=`echo "${FILENAME}" |sed 's/^[^0-9]\+\([0-9]\+\).*$/\1/'`;
# ファイル名に数字が含まれているない場合は、次のループへ
if ! expr "${FILENO}" : '[0-9]*' > /dev/null ; then
continue;
fi
# ファイル名の数字を4桁に設定する file0.jpeg -> file0000.jpeg
FILENO=`printf %04d ${FILENO}`;
# ファイル名の前半部分を取得する file0.jpeg -> file
FILENAME1=`echo "${FILENAME}" |sed 's/\(^[^0-9]\+\)\([0-9]\+\)\(.*$\)/\1/'`;
# ファイル名の後半部分を取得する file0.jpeg -> .jpeg
FILENAME2=`echo "${FILENAME}" |sed 's/\(^[^0-9]\+\)\([0-9]\+\)\(.*$\)/\3/'`;
# 新しいファイル名を設定する。
NEWFILENAME=`echo "${FILENAME1}""${FILENO}""${FILENAME2}"`;
#echo mv "${FILENAME}" "${NEWFILENAME}";
mv "${FILENAME}" "${NEWFILENAME}";
FILELIST=`echo -n "${FILELIST}" \""${NEWFILENAME}"\"`;
done
if [ "${FILELIST}" != "" ]; then
SORTFILELIST='';
# ソートしたファイルリストを作成
for FILENAME in `echo ${FILELIST}|xargs ls -v1`
do
SORTFILELIST=`echo -n "${SORTFILELIST}" \""${FILENAME}"\"`;
done
# PNG ファイルを PDF に変換
echo convert "${SORTFILELIST}" "${PDFFILE}"
echo ${SORTFILELIST} "${PDFFILE}" |xargs convert;
fi
※ このスクリプトは、ファイル名に数字の文字列が複数箇所含まれているファイル名には対応していません。
例 : filename.20171107_153011.jpg filename.20171107_153012.jpg ..
コメント