ImageMagick 使用例 -- 画像のワープ
- ImageMagick 使用例 前書きと目次
- 単純な画像ワープ (ピクセルの並べ替え)
- 画像の反転とミラーリング
- 対角線方向の転置と逆転置
- 矩形回転
- 画像のロール (調子の悪いテレビのように)
-
画像の回転 (単純な画像回転)
- 画像のせん断 (線形変位)
-
画像の波打ち (サイン波変位)
- 画像のエクスプロード
-
アニメーション (楽しい例) このセクションでは、ImageMagick が提供する一般的でより単純な画像ワープおよびゆがみ(distortion)オペレータを見ていきます。これは、後のセクションで扱うより高度で複雑なゆがみへの興味をかき立てるためのものです。
単純な画像ワープ
単純な画像ワープオペレータは、画像内のピクセルを並べ替えるだけです。ピクセルの数も画像のサイズも変わりません。重要な特徴は、画像が情報を一切失わず、ただ並べ替えられるだけなので、品質の損失なく(保存時の JPEG のような非可逆圧縮を除けば)容易に元に戻せるということです。基本的には、元画像の内容を破壊、上書き、コピー、色の混合、その他の変更を行うことなく、ピクセルを並べ替えるだけです。画像内のピクセル位置を移動させるだけなのです。
反転とミラーリング
これらの例では、このかわいらしいコアラの画像を使いましょう。 最も単純な画像のゆがみは、画像内のピクセルを並べ替えて上下逆さまに「-flip」反転させることです。 |
magick koala.gif -flip flip.gif
![[IM Output]](../static/img/warping/flip.gif)
あるいは「-flop」を使えば、鏡像を生成できます。 |
magick koala.gif -flop flop.gif
![[IM Output]](../static/img/warping/flop.gif)
| IM v6.6.6-5 より前では、「[-flip](https://imagemagick.org/command-line-options/#flip)」と「[-flop](https://imagemagick.org/command-line-options/#flop)」のどちらのオペレータも、存在する可能性のあるより大きな仮想キャンバスに対する画像の仮想キャンバスオフセットを変更しませんでした
---|---
対角線方向の転置と逆転置
「-transpose」と「-transverse」の画像操作は、画像の対角線方向の鏡像を生成します。 「-transpose」は、画像の左上から右下への対角線に沿って画像をミラーリングします。 |
magick koala.gif -transpose transpose.gif
![[IM Output]](../static/img/warping/transpose.gif)
一方「-transverse」は、画像の左下から右上への対角線に沿って画像をミラーリングします。 |
magick koala.gif -transverse transverse.gif
![[IM Output]](../static/img/warping/transverse.gif)
| IM v6.6.6-5 より前では、「[-transpose](https://imagemagick.org/command-line-options/#transpose)」と「[-transverse](https://imagemagick.org/command-line-options/#transverse)」のどちらのオペレータも、存在する可能性のあるより大きな仮想キャンバスに対する画像の仮想キャンバスオフセットを変更しませんでした
---|---
矩形回転
上に示した4種類の操作はすべて、本質的には元画像の鏡像を生成します。「-rotate」オペレータは、元画像そのものを含め、鏡像ではないその他のバージョンの画像を提供します。
magick koala.gif -rotate 0 rotate_0.gif
magick koala.gif -rotate 90 rotate_90.gif
magick koala.gif -rotate 180 rotate_180.gif
magick koala.gif -rotate -90 rotate-90.gif
magick koala.gif -rotate 360 rotate_360.gif
「-rotate」は、回転角度が90度の倍数の場合にのみ単純なゆがみとなることに注意してください。それ以外の角度では、画像により複雑なピクセルレベルのゆがみが入り込みます。下記の回転を参照してください。 |
正の回転角度が時計回りであることに気づくかもしれませんが、これは論理的に正しくないように思えます。しかし内部的には数学的に正しく、Y軸を反転させて使っていることが原因です。すなわち、Y軸は上端が0で下方向に正となります。このため座標系が反転し、その結果として回転角度も数学的に反転します。 |
|---|---|
デジタル写真は、「-auto-orient」オペレータを使うことで、記録されたカメラの向きに合わせて回転させることもできます。これは IM v6.2.7-8 で追加されました。 |
|
| --- | --- |
調子の悪いテレビのように画像をロールする
画像を水平方向に「-roll」(同期が外れたテレビのように)ロールすることもできます。ロールの量(画像の変位)はピクセル単位で指定します。 |
magick koala.gif -roll +0+20 roll_horiz.gif
magick koala.gif -roll +30+0 roll_vert.gif
![[IM Output]](../static/img/warping/roll_vert.gif)
あるいは負のピクセル数を使えば、逆方向にロールできます。 |
magick koala.gif -roll +0-20 roll-horiz.gif
![[IM Output]](../static/img/warping/roll-horiz.gif)
ロールはタイル画像にとって特に重要です。なぜなら、画像の「タイル化可能性」を破壊することなくタイルの原点を再配置するからです。実際、それこそが「-tile-offset」設定が定義しているものであり、「-tile」オプションでタイル画像が読み込まれる際に、どれだけのロールを適用するかを定義します。
単純な画像ワープのまとめ
これらすべてのオペレータの最も重要な側面は、それらをさまざまな方法で組み合わせて、まるで何の操作も行わなかったかのような結果を得られるということです。 |
magick koala.gif -roll +25+0 -rotate 90 -flop \
-roll +0-25 -flip -rotate 90 original.gif
回転とせん断
上記の単純なゆがみオペレータは画像のサイズと色を保持しますが、次の一連のオペレータはそうではありません。これらのオペレータの結果は、元のサイズ、あるいは元の画像のラスターグリッドにすら収まりません。
画像の回転 -- 単純な画像回転
上で見たように、「-rotate」オペレータは、90度単位で画像を回転させる場合には、画像を保持する単純なゆがみを実行できます。 しかしそれ以外の角度では、回転した画像は矩形の画像にきれいには収まりません。その結果、画像データが失われないように、最終的な画像のサイズが回転した画像を収めるのにちょうど十分なだけ拡大されます。 |
magick koala.gif -rotate 30 rotate.jpg
![[IM Output]](../static/img/warping/rotate.jpg)
回転の方向は時計回りであることに注意してください。これは数学的に非論理的に思えるかもしれませんが、画像の座標系が、数学の慣例である左下ではなく、画像の左上を基準としていることに気づけば理解できます。その結果、回転角度は論理的に予想されるものとは逆になります。これは、数学的な回転と比較して、いかなる形の画像回転を扱う際にも心に留めておくべき重要な点です。 ImageMagick が追加する余分な空間は、現在の「-background」色設定で色付けされます。これにより、隅に塗り込む色を指定できます。 |
magick koala.gif -background lightskyblue -rotate 30 rotate_color.png
![[IM Output]](../static/img/warping/rotate_color.png)
もちろん透明色で塗りたい場合は、画像が透明度を扱えること(アルファチャンネルを有効化・追加することで)、そして透明度を扱える画像フォーマットで保存することを確認する必要があります。 |
magick koala.gif -alpha set -background none -rotate 30 rotate_trans.png
![[IM Output]](../static/img/warping/rotate_trans.png)
余分な空間が黒く出てくる場合、出力画像のフォーマットがアルファチャンネルの使用を許可していない(おそらく JPEG フォーマット)ため、透明度はデフォルトで黒になります。 | バージョン 6.1.2 より前では、「-rotate」は透明度を正しく扱えず、回転した画像の隅に黒と透明の縞模様を生成していました。この問題の回避策はかなり複雑で、アルファチャンネルを色とは別に回転させる必要がありました。
---|---
ところで、その余分な空間が欲しくなく、画像の元のサイズを保持したい場合はどうすればよいでしょうか? 中央寄せの「-crop」を使って画像を元のサイズに戻すことができます。元のサイズが分からない場合は、アルファ合成のトリック(「[Src](compose.html#src)」合成方法を参照)を使って画像を元のサイズに復元できます。 |
magick koala.gif -alpha set \( +clone -background none -rotate 30 \) \
-gravity center -compose Src -composite rotate_resized.png
![[IM Output]](../static/img/warping/rotate_resized.png)
「-rotate」オペレータは、2つの追加フラグも理解します。回転の引数に「>」記号を(数値の前後に)追加すると、画像が縦よりも横に広い場合にのみ回転されます。つまり「90>」は「横長(landscape)」(幅の広い)スタイルの画像だけを「縦長(portrait)」(縦長の)スタイルの画像に回転させ、すべての画像を「縦長」スタイルにします。もう一方のフラグ「<」はその逆を行い、横よりも縦に高い画像だけを回転させます。例えば「90<」はすべての画像が「横長」になるようにします。 このフラグのもう一つの使い方は、「縦長」画像と「横長」画像を異なる量だけ回転させることです。つまり、2つの異なる「-rotate」操作を与えて、「縦長」を一方向に、「横長」を別方向に傾けることができます。 デジタル写真は、「-auto-orient」オペレータを使うことで、(画像の EXIF メタデータに基づく)カメラの向きに合わせて回転させることもできます。ただし、JPEG フォーマットに戻して保存するのは良い考えではないかもしれないことを覚えておいてください。
回転オペレータの内部処理
IMv6.7.3-4 以降、回転オペレータはゆがみオペレータとScale-Rotate-Translate (SRT) ゆがみを使うようになりました。 以下は、その基盤となる SRT ゆがみを使った、より直接的な回転です。 |
magick koala.gif -virtual-pixel background -background lightskyblue \
-distort SRT 30 +repage rotate_srt.jpg
![[IM Output]](../static/img/warping/rotate_srt.jpg)
あるいは、ゆがみオペレータの「+」バージョンを使ってキャンバスサイズを調整します。 |
magick koala.gif -virtual-pixel background -background lightskyblue \
+distort SRT 30 +repage rotate_srt2.jpg
![[IM Output]](../static/img/warping/rotate_srt2.jpg)
一般ゆがみオペレータは、回転中心の正確な位置指定、スケーリング、フィルタ制御、出力画像サイズ、そして画像レイヤリングの制御など、より単純な回転オペレータが提供しない多くの制御を提供します。 IMv6.7.3-4 より前では、回転オペレータは単純な90度回転ゆがみに続いて3回の画像せん断を行うことで実装されており、これは「せん断による回転(Rotate by Shear, RBS)」として知られる技法です。これは Alan Paeth が研究論文で初めて発表した技法です。残念ながら、これは3回の別々のせん断操作を必要とするため、非常にばらつきの大きい激しいぼけ効果が生じます。特に細い線をせん断する場合に顕著で、これが回転がゆがみを使って実装し直された理由です。この有害な効果は、下記の回転アニメーションで確認できます。せん断として回転を行っていたライブラリ関数は API では依然として利用可能ですが、せん断を自分で行わない限り、コマンドラインからは利用できなくなりました。この技法の詳細については、下記のせん断オペレータを参照してください。さまざまな画像回転アルゴリズムがどのように機能するか、そして関連する問題についてのより深い理解については、Leptonica Rotation を参照してください。また、一般ゆがみ技法で使われている例も参照してください。
画像のせん断 -- 線形変位
「-shear」オペレータは、ピクセルの各行(または各列)を取り、それらをずらして、各行(または各列)が隣接する行(または列)に対して同じ量だけ変位するようにします。その2つの引数は角度で与えられます。「-rotate」と同様に、この操作は情報を失わないように結果画像のサイズを大きくします。しかしせん断はより複雑で、実際には二重の操作です。
magick koala.gif -background Blue -shear 20 shear_rot.gif
magick koala.gif -background Blue -shear 20x0 shear_x.gif
magick koala.gif -background Blue -shear 0x50 shear_y.gif
magick koala.gif -background Blue -shear 20x50 shear_xy.gif
magick koala.gif -background Blue -shear 20x0 -shear 0x50 shear_xy2.gif
magick koala.gif -background Blue -shear 0x50 -shear 20x0 shear_yx.gif
結果を見ると、完全な X-Y 「-shear」(4番目の画像)は、実際には X せん断を先に行い、その後 Y せん断を行うこと(適切な画像トリミングを伴う)と等価であることがわかります(5番目、すなわち最後から2番目の画像に示されています)。せん断の順序が異なる結果を生むことに注意してください。1つの数値だけが(最初の画像のように引数に「x」を入れずに)与えられた場合、「-shear」はそれを X 方向と Y 方向の両方に、一種の貧者の回転として適用します。 「-background」色設定は、もちろん追加される余分な空間の色として使われます。 |
magick koala.gif -background none -shear 30 shear_trans.png
![[IM Output]](../static/img/warping/shear_trans.png)
| IM バージョン 6.1.2 より前では、「-shear」は透明度を扱えませんでした。この問題の回避策はかなり複雑で、アルファチャンネルを色とは別にせん断する必要がありました。
---|---
このように「-shear」を使うのは、画像を回転させる正しい方法ではないことに注意してください。実際にせん断を使って画像を適切に回転させるには、「-shear {X}x{Y} -shear {X}x0 -crop ...」の形で複数のせん断操作を実行する必要がありますが、「{X}」「{Y}」と最終的なトリムの適切な値を求めるには、いくらかの三角法が必要です。「回転オペレータ」は実際にかつてこの方法で実装されており、これを行う API 関数は依然として利用可能ですが、コマンドラインからはもう利用できません。 | X 方向のせん断は画像の高さに影響を与えず、Y 方向のせん断は画像の幅に影響を与えないことに注意してください。その結果、画像内の何らかのオブジェクトが覆う面積は変わりません(画像を保持する周囲の容器だけが変わります)。
---|---
| _せん断オペレータは、ソース画像の直接的な「ワープ」(個々の行と列のみのピクセルのゆがみ)として実装されています。その結果、補間設定も仮想ピクセル設定も使いません。
その結果、画像に追加される領域は現在の「-background」色だけで埋められ、画像の元の色を保持する方法は提供されていません。_
---|---
画像フィルタ、補間、仮想ピクセルの使用を可能にする代替方法については、アフィンゆがみを参照してください。アフィン行列を使ってせん断を実装する方法については、アフィンせん断を参照してください。ただし、どちらの方法も角度引数を使ってせん断を指定することはできません。
せん断によるアイソメトリックな立方体
せん断は使うのに最も良い、あるいは最も単純なオペレータではありませんが、だからといって凝ったことができないわけではありません。以下は、「-shear」を使ってアイソメトリックな立方体を作る例です。 |
# 立方体用の正方形画像をいくつか作成
magick logo: -resize 256x256^ -gravity center -extent 256x256 top.jpg
magick ../img_photos/pagoda_sm.jpg -resize 256x256 left.jpg
magick ../img_photos/mandrill_orig.png -resize 256x256 right.jpg
# 上面画像のせん断。
magick top.jpg -resize 260x301! -alpha set -background none \
-shear 0x30 -rotate -60 -gravity center -crop 520x301+0+0 \
top_shear.png
# 左面画像のせん断
magick left.jpg -resize 260x301! -alpha set -background none \
-shear 0x30 left_shear.png
# 右面画像のせん断
magick right.jpg -resize 260x301! -alpha set -background none \
-shear 0x-30 right_shear.png
# それらを結合。
magick left_shear.png right_shear.png +append \
\( top_shear.png -repage +0-149 \) \
-background none -layers merge +repage \
-resize 30% isometric_shears.png
# クリーンアップ
rm -f top.jpg left.jpg right.jpg
rm -f top_shear.png left_shear.png right_shear.png
![[IM Output]](../static/img/warping/isometric_shears.png)
上記は、Wolfgang Hugemann ImageMagick@Hugemann.de 氏の IM 使用例への寄稿である Using IM under Windows における類似の Windows バッチ例から発展させたものです。 上記の画像は正しく結合されていないことに注意してください。それらは Plus アルファ合成を使うべきですが、代わりに over を使っています。詳細については、2つのマスクされた画像の位置合わせを参照してください。その結果、3つの画像を正しく位置合わせするのに問題が生じ、隙間や画像の重なりが発生することがあります。位置指定が整数の位置に制限されているため、この問題は特に深刻になることがあります。扱いやすい座標を使ってずっと大きなサイズを用い、計算を少し調整することが、この場合に役立ちます。画像が結合された後、結果を最終サイズに縮小すると、結合部分に沿ったわずかな位置ずれがシャープになり、きれいになります。 アフィンゆがみを使い、正しいアルファ合成を用いた別の類似の例として、アフィンレイヤリングを使った3D立方体があります。これは、上記のような立方体を生成するのに必要な画像処理を大幅に簡素化する方法です。
画像の波打ち - サイン波変位
「-wave」オペレータは、画像に「線形変位」を加えるという点で「-shear」に似ています。ただしこのオペレータは、サイン波関数に従ってピクセルの列を垂直方向にのみ変位させます。「-wave」オペレータには2つの引数があります。1つ目はピクセルが上下に変位する最大の高さ、すなわち_振幅_で、2つ目はサイン関数の_波長_をピクセル単位で表したものです。 |
magick koala.gif -background Blue -wave 10x64 wave.jpg
![[IM Output]](../static/img/warping/wave.jpg)
ピクセルは与えられた_振幅_まで変位し得るため、たとえその空間が実際には必要なくても、その分の余分な空間が常に画像の上下両方に追加されることに注意してください。例えば、_波長_を画像の幅の2倍にするように引数を調整すると、画像を弧にすることができます。 |
magick koala.gif -background Blue -wave 20x150 arched.jpg
![[IM Output]](../static/img/warping/arched.jpg)
このような場合、未使用の空間は「-chop」「-shave」、あるいは場合によっては「-trim」操作のいずれかを使って削除できます。先ほどの例を、負の振幅を使って弧をひっくり返し、「-chop」を使って「-wave」オペレータが追加した未使用の空間を削除することで、きれいにしましょう。 |
magick koala.gif -background Blue -wave -20x150 \
-gravity South -chop 0x20 arched_2.jpg
![[IM Output]](../static/img/warping/arched_2.jpg)
もちろん「-background」色設定を使って、画像に追加される余分な空間を定義できます。 |
magick koala.gif -alpha set -background none -wave 10x75 wave_trans.png
![[IM Output]](../static/img/warping/wave_trans.png)
上記の例からわかるように、「-wave」は垂直方向すなわち「Y」方向にのみ適用されます。X 方向に波を追加したい場合は、波を適用する前後で画像を回転させる必要があります。 |
magick koala.gif -rotate -90 -background Blue -wave -10x75 \
-rotate +90 wave_y.jpg
![[IM Output]](../static/img/warping/wave_y.jpg)
この技法は、任意の角度で画像に波模様や振動を加えるのに使えます。この例は、ビブラートフォントとスモーキングフォントで示されています。 「-wave」のもう一つの制限は、波が常にゼロから始まることです。すなわち、最も左の列は変位せず、次のいくつかの行が下方向(正の X 方向)に変位します。ただし、初期の垂直オフセットとして負の_振幅_を与えた場合は別です。 基本的に「-wave」オペレータは、(現時点では)サイン関数の開始位置にオフセットを指定することができません。しかしこれは、「-splice」を使って画像オフセットを追加してから削除することで修正できます。 |
magick koala.gif -splice 19x0+0+0 -background Blue -wave 10x75 \
-chop 19x0+0+0 wave_offset.jpg
![[IM Output]](../static/img/warping/wave_offset.jpg)
「-wave」は追加された領域の色を定義するのに現在の仮想ピクセル設定を使いませんが、ソースから生成された画像へ色をマッピングするために現在の補間設定を参照します。これは、波が画像全体にわたって垂直の帯状にピクセルをわずかにぼかす傾向があることを意味します。
円形ゆがみ
ここまでの画像のゆがみは、画像データの伸縮、拡大、圧縮がほとんどなく、かなり穏やかなものでした。すなわち、データはほとんど変わらないままです。次のいくつかの画像オペレータは、元画像を判別できないほどに画像をゆがませる結果を生み出します。色はぼやけた混沌へとねじれます。また、これらは円形の領域にゆがみ効果を限定し、画像の矩形の縁では元画像のゆがみがほとんど、あるいは全くないという性質も持ちます。つまり、領域オペレータを使ってより小さな領域にこれらのオペレータを使っても、その結果は、切り取られ、ワープされ、元の位置に貼り戻されたように見えることなく、元画像に溶け込みます。すなわち、これらのオペレータは、画像のより小さな領域をワープするのに使えるため、「局所的(local)」ゆがみとして知られています。
画像のインプロード
「-implode」オペレータは、すべてのピクセルを中心に向かって引き寄せるように画像をワープします。これはまるで、画像の中心に掃除機や「ブラックホール」を突き刺し、ピクセルをそれに向かって吸い込むようなものです。ただし、最初はごく小さな値だけを使い、望む結果が得られるまで徐々にそれらの値を増やしていくことをお勧めします。初心者ユーザーは大きすぎる値を使い、結果に失望しがちです。例えば、これは典型的な画像のインプロージョンです。 |
magick koala.gif -implode .6 implode.gif
![[IM Output]](../static/img/warping/implode.gif)
ますます大きな値を使うと、本質的に円の中のすべてのピクセルを無の彼方へと吸い込みます。 |
magick koala.gif -implode 5 implode_big.gif
![[IM Output]](../static/img/warping/implode_big.gif)
ただし、「1.0」より大きい「-implode」値を使うと、アルゴリズムが実際の画像そのものの境界を越えて色を参照し始めるため、仮想ピクセル設定の影響も受けることに注意してください。デフォルトの「-virtual-pixel」設定は「edge」なので、画像の縁の色や周囲のフレームが結果に大きな影響を与え得ます。例えば、この2つの画像は、一方に白い境界が追加されている点を除いて同じです。これは基本的に、画像本体の境界の外から参照された色を使っている領域を示しています。通常「-virtual-pixel」設定によって定義される領域です。 |
magick rose: -gravity center -crop 46x46+0+0 +repage \
-implode 3 implode_rose.gif
magick rose: -gravity center -crop 44x44+0+0 +repage \
-bordercolor white -border 1 -implode 3 implode_rose_2.gif
![[IM Output]](../static/img/warping/implode_rose_2.gif)
「[Background](misc.html#background)」のような異なる仮想ピクセル設定を使うと、「-border」を追加するのと同じ効果が、画像を拡大することなく得られます。その他の仮想ピクセル設定は、中央のインプロードされた領域でずっと興味深い効果を生み出すことができます。例えば「[Tile](misc.html#tile)」設定を使うと、画像の高度にゆがんだコピーを追加できます。例えば、ここではこの設定を使って単純な箱の画像をインプロードします。 |
magick -size 94x94 xc:red -bordercolor white -border 3 \
-virtual-pixel tile -implode 4 implode_tiled_box.gif
![[IM Output]](../static/img/warping/implode_tiled_box.gif)
さらに多くの「-virtual-pixel」効果は、仮想ピクセルのインプロージョン効果で探究されています。 小さな領域へインプロードされるピクセルの数が増え、インプロードパラメータのサイズが非常に大きくなると、結果は「ピクセル化された」見た目になり始めます。より良い、より一貫した結果を得るには、スーパーサンプリングという技法を使って、インプロードが扱うピクセルの数を増やすことができます。基本的には、より大きな画像を使い(必要ならソース画像を拡大し)、ゆがみを行ってから、結果を最終サイズに縮小することで、ずっと良い結果が得られます。 |
magick -size 94x94 xc:red -bordercolor white -border 3 \
-virtual-pixel tile -resize 400% -implode 4 -resize 25% \
implode_tiled_ss.gif
![[IM Output]](../static/img/warping/implode_tiled_ss.gif)
ご覧のように、ゆがみの内部の詳細をずっと良く示す、はるかに滑らかでより現実的な結果が得られます。ただし、スーパーサンプリングですら、無限大を伴うこのような極端な画像では破綻します。注意深く見ると、「ぶつぶつした」見た目が戻ってくるのがわかりますが、それは中心により近いところだけです。 インプロードする画像の周りにより大きな「-border」を使い、後でそれを再び削除することで、画像の縁を中心に向かって内側にワープすることもできます。 |
magick koala.gif -bordercolor blue -border 20x20 \
-implode .5 -shave 18x18 implode_border.jpg
![[IM Output]](../static/img/warping/implode_border.jpg)
IM バージョン 6.2.1 以降では、透明な境界や透明度のある画像を使うこともできます。 |
magick koala.gif -bordercolor none -border 20x20 \
-implode .5 -shave 18x18 implode_border_trans.png
画像のエクスプロード
「-implode」オペレータに負の値を使うことで、画像をエクスプロード(爆発)させることができます。ただしこれは、真の爆発というよりは、画像の中心を拡大して中半径のピクセルをすべて縁に向かって押し出すようなものです。 |
magick koala.gif -implode -2 explode.jpg
![[IM Output]](../static/img/warping/explode.jpg)
より大きな値を使うと、本質的に画像の最も中心のピクセルを、最小の画像寸法の3分の2のサイズの円へと拡大します。 |
magick koala.gif -implode -30 explode_big.jpg
![[IM Output]](../static/img/warping/explode_big.jpg)
そしてこちらが「スーパーサンプリング」したバージョンです。 |
magick koala.gif -resize 400% -implode -30 \
-resize 25% explode_big_ss.jpg
![[IM Output]](../static/img/warping/explode_big_ss.jpg)
内部の「爆発」の中心の色は、画像(または領域)の中心の色によって設定されます。これは、エクスプロードする前にその点の周りの色を変えることで、爆発の「閃光」効果を制御できることを意味します。この色制御のアニメーション例については、下記のアニメーションを参照してください。 インプロードされた画像のもう一つの例については、Flickr のユーザー hh の寄稿を参照してください。
画像の渦巻き(ホワールプール)
「-swirl」オペレータは、ケーキミキサーのように動作します。引数として与えた度数だけ、画像を円を描くようにワープします。 |
magick koala.gif -swirl 180 swirl.jpg
![[IM Output]](../static/img/warping/swirl.jpg)
境界を追加し、「-implode」と組み合わせることで、画像を無の彼方へ吸い込む渦巻きのような見た目を作れます。 |
magick koala.gif -bordercolor white -border 20x20 \
-swirl 180 -implode .3 -shave 20x20 whirlpool.jpg
![[IM Output]](../static/img/warping/whirlpool.jpg)
このゆがみの主要な性質は、画像が中心で指定した角度だけ回転される一方、円形の縁は(上記のインプロードオペレータのように)影響を受けないままになることです。現時点では、渦巻きをフルディスクではなくリングに限定するための「内半径」を指定するパラメータはありません。これらの渦巻き効果をアニメーション化しましたので、下記のアニメーションで見ることができます。
アニメーション(楽しい例)
締めくくりに、これらのゆがみのいくつかの GIF アニメーションを生成しましょう。これらのために、アニメーション画像を生成する単純なシェルスクリプトをいくつか作りました。ダウンロードして、自分のテスト画像で遊ぶこともできます。これは重要な点につながります。これらのゆがみを使って一連の画像を生成する場合、画像を繰り返し段階的にゆがませるのではなく、常に元の開始画像からゆがませる方が良いのです。これは特に回転画像に当てはまります。回転画像では結果にいくらかのぼけが生じ、個々の操作では最小限ですが、それを繰り返し行うと、このような結果になります。 すべてのスクリプトは、アニメーションを作成するために「生成された「magick」コマンド」という技法を使っています。すなわち、シェルスクリプトが1つの長いコマンドを作成し、それを実行します。これは一時ファイルを生成する必要を避けますが、デバッグが難しくなることがあります。もう一つの代替方法は、MIFF 画像ストリーミングとして知られる方法を使うことです。これはループ内で個々の画像を生成し、それを最終的な「マージ」コマンドに「パイプ」します。これは、例のレイヤー画像のプログラムによる位置指定と地図上のピンでより明確に示されています。 ![]() |
シェルスクリプト「animate_mixer」では、各フレームが元画像に「-swirl」を使って生成されます。渦巻きは一方向にアニメーション化され、それから再び戻って連続したサイクルを形成します。これは実際、IM における非常に典型的なワープアニメーションの例です。この変形として、アニメーションが別の似た画像へとワープを解いていくものがあります。 |
|---|---|
![]() |
シェルスクリプト「[animate_whirlpool](../static/img/warping/animate_whirlpool)」は、各画像フレームに「[-swirl](https://imagemagick.org/command-line-options/#swirl)」を使うだけでなく、引数のサイズを増やしながら「-implode」も使います。画像全体が「排水口に吸い込まれる」ことを示すために、追加される空間に「lightblue」の境界色を使いましたが、より良い、より現実的な効果のためには、代わりに同じ白い背景色を使うべきでした。 |
| --- | --- |
![]() |
画像の中央での爆発です(スクリプト「animate_explode」を参照)。画像は再び拡大されて画像全体がエクスプロードされ、最終的な色を定義するために中心に色付きの点が描かれています。 |
| --- | --- |
![]() |
シェルスクリプト「animate_flex」を使い、「-wave」関数の振幅を正と負の両方に変えることで、画像の中心が上下にしなります。 |
| --- | --- |
![]() |
シェルスクリプト「animate_flag」を使い、画像が旗のようにはためく「オフセット波」アニメーションを作ります。各フレームの画像を垂直方向にもオフセットして左端を一定に保ち、おそらく旗竿を追加することで、アニメーションを改善できます。ただし、それにはそのオフセットを数学的に求める必要があり、これは厄介なことがあります。 |
| --- | --- |
![]() |
スクリプト「animate_rotate」がこの回転アニメーションを生成しましたが、上で説明したように元画像のサイズを保持するために、各フレームを元画像でクロップしています。 |
| --- | --- |
![]() |
比較として、こちらはデフォルト設定と「-distort SRT {angle}」コマンドを使って生成したコアラの回転です。生成に使ったスクリプトは「animate_distort_rot」です。この回転方法を使うと、画像がどれほどシャープか、そして前のバージョンで明らかだった回転の「ジッター」がないことに注目してください。 |
| --- | --- |
ボーナスアニメーションと動画
ボーナスとして、フランスの Florent Monnier 氏が、IM OCaml API スクリプトを使って作成した「[-swirl](https://imagemagick.org/command-line-options/#swirl)」ゆがみオペレータを使う気の利いた動画を作りました。右の GIF アニメーションを選択すると、動画のフルバージョンをダウンロードできます。 ゆがみマップ技法を実演する良い動画を作れますか? ネット上の他の場所でそのようなものを知っていますか? メールをください。
![[IM Output]](../static/img/warping/rotate_0.gif)
![[IM Output]](../static/img/warping/rotate_90.gif)
![[IM Output]](../static/img/warping/rotate_180.gif)
![[IM Output]](../static/img/warping/rotate-90.gif)
![[IM Output]](../static/img/warping/rotate_360.gif)
![[IM Output]](../static/img/warping/roll_horiz.gif)
![[IM Output]](../static/img/warping/original.gif)
![[IM Output]](../static/img/warping/shear_rot.gif)
![[IM Output]](../static/img/warping/shear_x.gif)
![[IM Output]](../static/img/warping/shear_y.gif)
![[IM Output]](../static/img/warping/shear_xy.gif)
![[IM Output]](../static/img/warping/shear_xy2.gif)
![[IM Output]](../static/img/warping/shear_yx.gif)
![[IM Output]](../static/img/warping/implode_border_trans.png)
![[IM Output]](../static/img/warping/animated_mixer.gif)
![[IM Output]](../static/img/warping/animated_whirlpool.gif)
![[IM Output]](../static/img/warping/animated_explode.gif)
![[IM Output]](../static/img/warping/animated_flex.gif)
![[IM Output]](../static/img/warping/animated_flag.gif)
![[IM Output]](../static/img/warping/animated_rotate.gif)
![[IM Output]](../static/img/warping/animated_distort_rot.gif)