コマンド
convert
画像ファイルを変換する (ImageMagick)
最終更新
convert コマンドは、ImageMagick というパッケージに含まれる画像変換コマンドである。フォーマット変換・リサイズ・切り出し等が行える。FreeBSD・Linux 等、多くの UNIX 系 OS では imagemagick というパッケージをインストールすることで使用することができる。
●ImageMagick バージョン7 以降の注意点
ImageMagick バージョン7 より、convert 等のコマンドがなくなり magick コマンドに変更されている。Windows で関係ない convert コマンドが存在し、混乱を招くため。2017年9月現在、FreeBSD では ImageMagick がバージョン6、ImageMagic7 がバージョン7 として ports/packages が用意されている。
●フォーマット変換
どのフォーマットに変換するかは、指定した拡張子から自動的に判別してくれる。
% convert sample.gif sample.jpg
⇒ GIF 形式の sample.gif から JPEG 形式の sample.jpg に変換する
一括変換したい場合は mogrify コマンドを使う。
% mogrify -format png *.jpg
⇒ JPEG ファイルを PNG 形式に変換する。拡張子 .png で新しいファイルが生成される。
サイズ指定でのリサイズ:
% convert -resize 100x200 from.png to.png
→ 100x200 の箱に収まるよう、縦横比を維持して変換する。元画像が 40x80 であれば拡大するし、200x400 であれば縮小する。
% convert -resize 100x from.png to.png
→ 横が 100ピクセル内に収まるよう、縦横比を維持して変換する。
% convert -resize x200 from.png to.png
→ 縦が 200ピクセル内に収まるよう、縦横比を維持して変換する。
縮小率・拡大率指定でのリサイズ:
% convert -resize 50% from.png to.png
→ 縦横それぞれが 50% の長さになるよう縮小する。
% convert -resize 150% from.png to.png
→ 縦横それぞれが 150% の長さになるよう縮小する。
縦横比が変わってもよいのでとにかく指定したサイズに変換したい場合は、以下のようにサイズの末尾に "!" を付ける。
% convert -resize 100x200! from.png to.png
サイズが不揃いな画像が複数あり、大きすぎる画像はあるサイズに縮小したいが、そのサイズ未満の場合は拡大はしない、としたい場合は、下記のように末尾に ">" を付ける。
% convert -resize '100x200>' from.png to.png
その逆で、小さすぎる画像は拡大したいが、大きい画像は縮小しないとする場合は、末尾に "<" を付ける。
% convert -resize '100x200<' from.png to.png
上書きで一括変換したい場合、mogrify コマンドを使う (元のファイルは残らない)。
% mogrify -resize 100x200! from.png to.png
●画像の切り出し (crop) 【2018-12-19追加】
crop オプションで、画像の一部を切り出すことができる。以下、base.png は 100x100 のサイズとする。
% convert base.png -crop 50x100+0+0 new.png
⇒ base.png の「左」半分を切り出し、new.png に保存する
% convert base.png -crop 50x100+50+0 new.png
⇒ base.png の「右」半分を切り出し、new.png に保存する
% convert base.png -crop 50x50+25+25 new.png
⇒ base.png の左上 (25px, 25px) の位置から 50x50 のサイズ、つまり中心部分を切り出し、new.png に保存する
元画像 (200x128):
左半分を切り出した例 (-crop 100x128+0+0)
●画像をぼかす (blur) 【2019-01-20 追加】
blur オプションで画像をぼかすことができる。ノイズ除去目的でも使用できる。
% convert -blue 2x2 from.png to.png
blur オプションの引数は [radius]x[sigma] で、意味は下記のとおり (ただし当ページ管理人はよくわからなかった)。
- radius: 半径のこと。ある点をぼかす際、周囲の半径何ピクセルから色情報をもってくるか、だと思う。
- sigma: マニュアルによるとぼかすブラシの太さ的なイメージらしい。
元画像:
-blur 1x1 の例:
-blur 2x2 の例:
-blur 5x5 の例:
●画像の上下反転・左右反転 (flip・flop) 【2019-01-19 追加】
flip オプションで、画像を上下反転することができる。
% convert -flip from.png to.png
flop オプションで、画像を左右反転することができる。
% convert -flop from.png to.png
flip・flop 両方のオプションを付けると、上下反転かつ左右反転する。
% convert -flip -flop from.png to.png
元画像:
flip で上下反転した画像:
flop で左右反転した画像:
flip + flop で上下・左右反転した画像:
●アニメーション GIF 生成・分割 (adjoin)
adjoin オプションで、アニメーション GIF を生成することができる。
% convert -adjoin image01.gif image02.gif image03.gif sample.gif
⇒ image01〜03.gif からなる、動画 GIF sample.gif を生成する
その逆はこれ。
% convert +adjoin sample.gif image%02d.gif
⇒ 動画 GIF sample.gif を分割し、image00,01,02...gif という画像ファイルを生成する
●枠をつける (border) 【2019-01-20 追加】
border オプションで、画像に枠を付けることができる。書式は下記のいずれか。
▷ -border [枠サイズ]
→ 上下左右に、指定サイズの枠線を追加する。
▷ -border [左右の枠サイズx上下の枠サイズ]
→ 左右と上下で、異なるサイズの枠線を追加する。片方の枠サイズを 0 にすることで、上下のみ・または左右のみに枠線を追加することができる。
▷ -border [N%]
→ 元画像の大きさの N% の枠を追加する。
また、-bordercolor にて枠の色を指定できる。省略時の色はグレーとなる。
元画像:
-border 4x15:
-border 10:
-border 10x0:
-border 10x0 -bordercolor '#ff0000':
イメージとしては、枠が / ̄\ こんな感じになっているとして、"+x+y" の部分で / と \ のサイズを指定する。枠が 10px で、枠外側が 5px、枠内側が 5px であるなら /\ のように見える。枠が 9px で、枠外側が 3px、枠内側が 3px であるなら、残り 3px は平坦部  ̄ の長さとなり、/ ̄\ のように見える。
また、-mattecolor にて枠の色を指定できる。省略時の色はグレーとなる。
-frame 10x10+5+5
-frame 10x10+2+8 (枠外側が 2px、枠内側が 8px)
-frame 10x10+8+2 (枠外側が 2px、枠内側が 8px)
-frame 10x10+2+2 (枠外側が 2px、枠内側が 2px、残り 6px が平坦部)
-frame 10x10+0+2 (枠外側はなし。枠内側が 2px、残り 8px が平坦部)
-frame 10x10+2+0 (枠外側は 2px、枠内側はなし。残り 8px が平坦部)
-frame 15x15+4+4 -mattecolor deepskyblue
●画像をトリミング・余白を削除 (trim) 【2019-01-20 追加】
画像のまわりの余白を削除 (トリミング) 画像サイズを小さくするには trim オプションを使う。余白の判定方法は、四隅の色と同じ色があれば余白と判定し、余白部分をできる限り小さくする。書式は以下のとおり。
% convert from.png -trim to.png
-fuzz オプションを付ける例は下記 (後述)。
% convert from.png -fuzz 10% -trim to.png
今度は ImageMagick 同梱のサンプル画像で試してみよう。
元画像
-trim 後
おっと、サイズが全く変わっていない。これはおそらく、手書きの絵をスキャンしたもので、ぱっと見は背景は白に見えるが、実際は違う色になっていると思われる。そのようなときは -fuzz オプションをつけて、どの程度色が異なった場合に同じ色とみなすかを指定できる。下記は -fuzz 10% としているので、RGB 値 0〜255 とすると 25 の違いまで許容することになる (たぶん)。
まず、下記のようなテキストファイルを用意する。
% cat sample.txt
hoge
abc def
元画像ファイルに "text:[テキストファイル名]" を指定し、それを画像ファイルに convet する。
% convert text:sample.txt text.png
すると下記のような画像が生成される。
背景色に #cccccc、文字色に #111111 を指定してみよう。そして画像サイズが大きすぎるので、-trim する。
convert -background '#cccccc' -fill '#111111' text:sample.txt -trim
今度は周りに余白が欲しくなったので、-border で枠線を追加する。枠線の色を --bordercolor で指定するが、その際背景色と同じにする。
convert -background '#cccccc' -fill '#111111' text:sample.txt -trim -bordercolor '#cccccc' -border 100x100
文字サイズを大きくする。
convert -background '#cccccc' -fill '#111111' -resize 30 text:sample.txt -trim -bordercolor '#cccccc' -border 100x100
●EXIF 情報等を削除する (strip)
画像ファイルに埋め込まれた EXIF 情報を削除するには strip オプションを使う。
% convert -strip from.jpg to.jpg
一括して上書き保存したい場合は mogrify -strip を使う (元のファイルは残らない)。
ファイルに埋め込まれた EXIF 情報は identify コマンドで確認できる。
このサンプル画像使う場合はサンプル画像名の後に ":" を付ける。
% convert logo: -resize 30x30 logo.png
サンプル画像の一覧は下記。
▷ granite (花崗岩)
▷ logo (ImageMagick のロゴ画像)
▷ rose (バラ)
▷ wizard (魔法使い)
▷ netscape (Netscape ブラウザで使用されていたセーフカラーと言われる 216色のカラーパレット)
サンプル画像の一覧は下記で取得可能 (ただし H はサンプル画像ではない)。
% convert -list coder | grep MAGICK
H MAGICK
GRANITE MAGICK
WIZARD MAGICK
NETSCAPE MAGICK
ROSE MAGICK
LOGO MAGICK
ではリスト名に何を指定するかだが、70種類以上もある。一番大事なのは「リスト名」一覧を表示する -list list かもしれない。
% convert -list list
Align
Alpha
Boolean
Cache
Channel
(略)
フォーマット一覧 (list format):
% convert -list format
Format Module Mode Description
-------------------------------------------------------------------------------
3FR DNG r-- Hasselblad CFV/H3D39II
3G2 MPEG r-- Media Container
3GP MPEG r-- Media Container
AAI* AAI rw+ AAI Dune image
AI PDF rw- Adobe Illustrator CS2
(略)
フォント一覧 (lise font):
% convert -list font
Path: /usr/local/etc/ImageMagick-6/type-ghostscript.xml
Font: AvantGarde-Book
family: AvantGarde
style: Normal
stretch: Normal
weight: 400
glyphs: /usr/local/share/ghostscript/fonts/a010013l.pfb
Font: AvantGarde-BookOblique
family: AvantGarde
style: Oblique
stretch: Normal
weight: 400
glyphs: /usr/local/share/ghostscript/fonts/a010033l.pfb
(略)
色一覧 (list color):
% convert -list color
Name Color Compliance
---------------------------------------------------
AliceBlue srgb(240,248,255) SVG X11 XPM
AntiqueWhite srgb(250,235,215) SVG X11 XPM
AntiqueWhite1 srgb(255,239,219) X11
AntiqueWhite2 srgb(238,223,204) X11
(略)
gravity 一覧 (list gravity):
% convert -list gravity
None
Center
East
Forget
NorthEast
North
NorthWest
SouthEast
South
SouthWest
West
まずは red, yellow などの色名で指定する方法がある。色名の一覧は -list color で表示できる。以下に "srgb(...)" とあるのは、世の中一般的な RGB だと思ってよい。
% convert -list color
Name Color Compliance
---------------------------------------------------
AliceBlue srgb(240,248,255) SVG X11 XPM
AntiqueWhite srgb(250,235,215) SVG X11 XPM
AntiqueWhite1 srgb(255,239,219) X11
AntiqueWhite2 srgb(238,223,204) X11
(略)
実際の色を見たい場合は
https://imagemagick.org/script/color.php を参照。
次に RGB (Red:赤、Green:緑、Blue:青) での指定方法。以下のいずれでもよい。
- #f00 (R・G・B それぞれを 0〜f の 16段階で指定)
- #ff0000 (R・G・B それぞれを 0〜ff の 256段階で指定)
- #ffff00000000 (R・G・B それぞれを 0〜ffff の 65536段階で指定)
- rgb(255, 0, 0) (R・G・B それぞれを 0〜255 の 256段階で指定)
- rgb(100.0%, 0.0%, 0.0%)
さらに透明度を指定することもできる。透明度を意味するアルファ値は、0で完全に透明、ff や 1.0 で完全に不透明となる。
- RGBA: #ff0000ff (RGB に加え、透明度を 00〜ff で指定)
- RGBA: #ffff00000000ffff (RGB に加え、透明度を 00〜ffff で指定)
- rgba(255, 0, 0, 1.0) (RGB に加え、透明度を 0〜1.0 で指定)
- rgba(100.%, 0.0%, 0,0%, 1.0) (RGB に加え、透明度を 0〜1.0 で指定)
CMYK は下記のようにする。
- icc-color(cmyk, 0.11, 0.48, 0.83, 0.00)