ImageMagick を使って jpeg ファイルを PDF 化する

LINEで送る
Pocket

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 ..

LINEで送る
Pocket

  • このエントリーをはてなブックマークに追加

コメント

コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください