UNIX/Linuxの部屋 convertコマンドの使い方

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド 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 で新しいファイルが生成される。

リサイズ・拡大・縮小 (resize)
resize オプションを使うとリサイズができる。標準では元画像の縦横比を「維持する」ことに注意。また、拡大するか縮小するかは指定するサイズ次第である。

サイズ指定でのリサイズ:
% 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':

フレームをつける (frame) 【2019-01-20 追加】
frame オプションで、画像に立体的な枠を付けることができる。書式は以下のとおり。
▷ -frame [左右の枠サイズx上下の枠サイズ+枠外側のサイズ+枠内側のサイズ]

イメージとしては、枠が / ̄\ こんな感じになっているとして、"+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

元画像
-trim 後

今度は ImageMagick 同梱のサンプル画像で試してみよう。

元画像
-trim 後

おっと、サイズが全く変わっていない。これはおそらく、手書きの絵をスキャンしたもので、ぱっと見は背景は白に見えるが、実際は違う色になっていると思われる。そのようなときは -fuzz オプションをつけて、どの程度色が異なった場合に同じ色とみなすかを指定できる。下記は -fuzz 10% としているので、RGB 値 0〜255 とすると 25 の違いまで許容することになる (たぶん)。

元画像
-fuzz 10% -trim の結果:

文字列からの画像生成 【2019-01-20 追加】
ロゴ画像生成など、元画像がない状態から、文字列入りの画像生成を行う方法を説明する。

まず、下記のようなテキストファイルを用意する。
% 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 を使う (元のファイルは残らない)。
% mogrify -strip *.jpg

ファイルに埋め込まれた EXIF 情報は identify コマンドで確認できる。

ImageMagick 標準のサンプル画像 【2019-01-20 追加】
ImageMagick にはいくつかのサンプル画像が同梱されている。ImageMagick の機能を試したい場合、わざわざ画像ファイルを用意しなくてもよいので楽である。

このサンプル画像使う場合はサンプル画像名の後に ":" を付ける。
% 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

ImageMagick での様々な情報一覧 (list) 【2019-01-20 追加】
ImageMagick で対応フォーマットや色名など、一覧を表示するには list オプションを使う。
% convert -list [リスト名]

ではリスト名に何を指定するかだが、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

ImageMagick での色指定方法 【2019-01-20 追加】
-background などのオプションで色を指定する場合の方法を説明する。

まずは 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)

すべての色名などは https://imagemagick.org/script/color.php を参照。HSL・HSB やリニア RGB (Liner RGB) での色指定方法も記述がある。

関連コマンド