kobapan@wiLiki
Login
Linux

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

画像ごとに表示時間を変える場合、

$ convert -geometry 160x120!  -loop 0 -delay 100 1.gif -delay 200 2.gif animation.gif

 

 

Debian
Emacs
Firefox
Gauche
JavaScript
Linux
Scheme
org-mode/latex

More ...