Linux:ImageMagick(convert)
imagemagickパッケージ内のアプリconvertで画像をコマンドライン変換
目次
上書き
convertコマンドの代わりにmogrifyコマンドを使えばよい。
$ convert -resize 200% original.bmp converted.bmp
↓
$ mogrify -resize 200% original.bmp
コントラストの調整
convert <変換前の画像名> -contrast <変換後の画像名>
convert before.jpg -contrast -contrast -contrast -contrast after.jpg
contrastには細かい値の指定がないらしいので、コントラストをさらに上げたいときは、-contrastを繰り返し記載する。
明るさの調整
convert <変換前の画像名> -normalize <変換後の画像名>
convert 640-2.png -normalize normalize-2.png
例えば、曇り空でどんより暗い景色の画像は、輝度ヒストグラムの分布が左側(暗い方)に偏っている為、輝度レベルを広げて右側(明るい方)を有効活用するだけで見やすくなります。極端に暗かったり明るかった位するピクセルを無視してくれます。
image to pdf
複数画像を1つのpdfにまとめる。
基本の使い方
$ convert hoge.jpg fuga.jpeg uho.png NEW.pdf
画像のファイル名を連番にしておいて、ワイルドカードで1括指定。
$ convert *.jpg NEW.pdf
正規表現?も使える。
$ convert [0-9].jpg NEW.pdf
pdf to image
pdfをページ毎に画像にする。
convert "ほげ.pdf" ほげ-%03d.jpg
favionを作る
$ convert icon.png -define icon:auto-resize favicon.ico
head内に以下のタグ
<link rel="icon" href="/path/to/favicon.ico" />
色指定で透過
$ convert -transparent white -fuzz 5% logo.png logo_.png
transparent オプションで透過色にする色を指定する。この例では、image.gif の白色部分を透過色にして hoge.gif に変換します。
また、一度に複数のファイルを変換したい場合は、mogrify コマンドを使用する。
$ mogrify -transparent white *.gif
ディレクトリ内のすべてのGIFファイルの白色部分を透過色にする。この場合は元ファイルが上書きされる
画像のフチの背景色を切り取って透明に
convert input.png \
-alpha set \
-background none \
-channel RGBA \
-fill '#00000000' \
-fuzz 5% \
-draw 'matte 1,1 floodfill' \
output.png
-draw の行を読む通り、 1,1 の座標からペイントツールのバケツのように #00000000 (透明) で塗りつぶす。
画像形式の変換
$ convert banner.jpg banner.png
新規にpngファイルが作られる
$ convert in.png out.jpg
$ ffmpeg -i in.png out.jpg
webp の変換ができないとき
$ convert K.webp K.jpg
convert: delegate failed `'dwebp' -pam '%i' -o '%o'' @ error/delegate.c/InvokeDelegate/1860.
convert: unable to open file '/tmp/magick-6839Vg-YIBzBI4SZ': そのようなファイルやディレクトリはありません @ error/constitute.c/ReadImage/596.
convert: no images defined `K.jpg' @ error/convert.c/ConvertImageCommand/3288.
convertが、webpの呼び出しに失敗しているので、webp を入れる
$ sudo apt install webp
反転
カレントディレクトリ内の拡張子がjpgのファイルをtmpディレクトリ内に左右反転して保存
$ mkdir tmp && for file in *.*jpg; do convert $file -flop tmp/$file; done
カレントディレクトリ内の拡張子がjpgのファイルを上下反転して上書き保存
$ for file in *.*jpg; do convert $file -flip $file; done
トリミング
crop
$ identify -format "%wx%h\n" in.jpg
identifyで、画像の(width)x(height)を得る
$ convert in.jpg -crop [width]x[height]+[x]+[y] out.jpg
crop (切り取るサイズ)+(切り取り開始座標) 単位はピクセル
一括変換(上書き、変数利用)
for file in *.jpg; do convert $file -crop 567x700+57+75 "$file" ; done
一括変換(トリミングしつつ png から jpg に変換)
x=325
y=75
end_x=810
end_y=710
w=$((${end_x}-${x}));
h=$((${end_y}-${y}));
for f in *.png; do convert $f -crop ${w}x${h}+${x}+${y} ${f/.png/.jpg} ; done
一括変換(別名保存)
for file in *.*png; do convert $file -crop 420x465+200x465 "new.$file" ; done
一括変化(1.jpg 〜 8.jpg と、9.jpg 〜 12.jpgで処理を分ける)
$ for file in *.jpg; do if [[ $file =~ 9|1[0-2].jpg ]]; then convert $file -crop 970x620+75+80 "n.$file"; elif [[ $file =~ [1-8].jpg ]]; then convert $file -crop 575x620+75+80 "n.$file"; fi; done
サイズ変換
resize.sh
画像のサイズを変換したいときに、以下やり方をすぐ忘れるので、resize.sh | github.com を作った。フォルダ内の画像を一括変換できる。
# Usage
#
# sh resize.sh SRC-DIRECTORY GEOMETORY [TYPE] [DIST-DIRECTORY]
#
# eg1.
# sh resize.sh ~/Picture 500x500
#
# This makes DIRECTORY `resize` in ~/Picture , and then make resized image as 500x500
# in ~/Picture/resize/ , geometry is not changed.
#
# If you want to change geometry run resize.sh like
#
# sh resize.sh ~/Picture 500x500!
#
# eg2.
# sh resize.sh filename.jpg 500x500
#
# This resize filename.jpg as 500x500.
#
# eg3.
# sh resize.sh filename.jpg 500x500 newfile.jpg
#
# This copy filename.jpg to newfile.jpg resized as 500x500.
一括サイズ変換(縦横比を維持)
$ for file in *.*jpg; do convert $file -geometry 320x100 $file; done
一括サイズ変換(縦横比を維持しない)
$ for file in *.*jpg; do convert $file -geometry 320x100! $file; done
mogrify というのラッパーがあることを知った。
縦横比を維持したままリサイズ。指定サイズ内に収まるように縮める
$ mogrify -resize 1366x768 *.png
縦横比を無視して強制リサイズ
$ mogrify -resize 1366x768! *.png
結合
2枚の画像を左右に繋ぐ
$ convert +append sample-01.jpg sample-02.jpg out.jpg
2枚の画像を上下にに繋ぐ
$ convert -append sample-01.jpg sample-02.jpg out.jpg
画像にボーダーをつける
convert <変換前の画像名> -bordercolor (color) -border (width) x (height) <変換後の画像名>
$ convert before.jpg -bordercolor "#ffffff" -border 4×4 after.jpg #等幅
$ convert before.jpg -bordercolor "#CC0000" -border 4%×4% after.jpg #元画像の縦横比にしたがった幅
アニメーション
連番になった .gif からアニメーションを作る
$ convert -geometry 160x120 -loop 0 -delay 100 [1-5].gif animation.gif
- -loop iterations引数を与えると iterations回だけループ。0を与えると、永久にループ
- -delay x 引数を 与えると 1枚の画像を100分のx秒間 表示する
画像ごとに表示時間を変える場合、
$ convert -geometry 160x120! -loop 0 -delay 100 1.gif -delay 200 2.gif animation.gif