ImageMagick 使用例 -- 高度なテクニック
ImageMagick 使用例 序文と目次 | 形状から作る3Dの箇条書き記号 | | スクリプトを使って大量の画像を生成する
3次元グレースケールのシェード画像に色付けと整形を行う
---|---|---|---
ロゴを3D化する | 透明オーバーレイを使って基本的に整形した画像へ色付けする
反射 | さまざまな種類の表面反射を加える。
ジグソーピース | 写真から変わった形のピースを切り出して加工する
「ジェル」効果 | ハイライトのサイズ・明るさ・シャープさを調整する
'Screen' と 'Multiply' 合成を使った明るさと暗さの調整
「アクア」効果 | 'curves' を使ってハイライトを調整する。
タイル化可能な星と彗星 | ランダムな点。
「なんてことだ! 一面の星だ! -- 2001年宇宙の旅」
放射状フレア | 中心点の周りにランダムな光線とリングを生成する。
このページでは、複数のテクニックを使って、IM の基本的な画像操作を超えた複合的な画像加工効果を生み出す、非常に大きな例を提供します。主要なテクニックは上記の索引にまとめられています。多くのテクニックは、フォントテンプレートの作成、画像への派手なラベル付け、マスクの使用など、ほかのページで提供されていますが、これらのページではそれらのテクニックを組み合わせて、より複雑な効果を生み出す方法を示します。
形状から作る3Dの箇条書き記号 -- スクリプトによるアプローチ
ウェブの一覧表示に使える「箇条書き記号」画像は、ウェブ上にたくさん用意されています。しかし、自分で3Dオブジェクトを生成すれば、サイト全体を特定のスタイルでまとめあげ、統一感を持たせることができます。これを実現する最善の方法のひとつが、特定のスタイルでありながら必要な色を何でも使える、さまざまなボタンや形状を自動生成できる「生成」スクリプトを作ることです。これはそうしたスクリプトのひとつで、ごく単純なものです。ここでは「[-shade](https://imagemagick.org/command-line-options/#shade)」オプションを使い、単純な形状の透明画像から3Dに見えるオブジェクトを生成します。形状はくっきりしたオン/オフの透明度しか持っておらず、それが注意深く保持されるため、ウェブページで一般的に使う透明GIF画像として利用できます。生成されたグレースケールの「シェード」画像は、その後「[-tint](https://imagemagick.org/command-line-options/#tint)」演算子で色付けされ、画像の中間調のグレーが設定される一方、より極端な黒や白の陰影はそのまま残されます。その後、提供された画像の元の形状が、色付けされた結果へ再び加えられます。おまけに、入力画像がブール値の透明度しか持たない場合、その結果もGIF形式の画像に適したブール値の透明度を持つことになります。
magick {_input_image_} -alpha set \
\( +clone -channel A -separate +channel \
-bordercolor black -border 5 -blur 0x2 -shade 120x30 \
-normalize -blur 0x1 -fill {_color_} -tint 100 \) \
-gravity center -compose Atop -composite \
{_output_image_}
上記のスクリプトでは、入力画像が一度しか読み込まれない点に注意してください。これにより、入力・出力のファイル名に「-」を使って(場合によっては IM の画像形式設定とともに)、このスクリプトをコマンドのパイプラインの中で使うこともできます。これは自分で IM スクリプトを書くときに重要になり得ます。上記のコマンドは「create_bullet」という非常に単純なシェルスクリプトに書き込まれ、以下のコマンドを実行して、さまざまな色のシンボル画像をまとめて生成しました。
magick +antialias -size 15x15 xc:none -draw 'circle 7,7 3,3' ball.gif
create_bullet ball.gif grey ball_grey.gif
create_bullet ball.gif red ball_red.gif
create_bullet ball.gif green ball_green.gif
create_bullet ball.gif blue ball_blue.gif
create_bullet ball.gif yellow ball_yellow.gif
create_bullet ball.gif maroon ball_maroon.gif
create_bullet ball.gif cyan ball_cyan.gif
magick -size 12x12 xc:black square.gif
create_bullet square.gif grey square_grey.gif
create_bullet square.gif red square_red.gif
create_bullet square.gif green square_green.gif
create_bullet square.gif blue square_blue.gif
create_bullet square.gif yellow square_yellow.gif
create_bullet square.gif maroon square_maroon.gif
create_bullet square.gif cyan square_cyan.gif
# retrieve asterix symbol from
# [Anthony's Web Images, Symbols](http://www.cit.griffith.edu.au/images/Symbols/Images.html)
create_bullet asterix.gif grey asterix_grey.gif
create_bullet asterix.gif red asterix_red.gif
create_bullet asterix.gif green asterix_green.gif
create_bullet asterix.gif blue asterix_blue.gif
create_bullet asterix.gif yellow asterix_yellow.gif
create_bullet asterix.gif maroon asterix_maroon.gif
create_bullet asterix.gif cyan asterix_cyan.gif
# Use a heart symbol from "WebDings" font (22 point => 16x16 pixel image)
magick -font WebDings -pointsize 22 -background none \
label:Y -trim +repage heart.png
create_bullet heart.png grey heart_grey.png
create_bullet heart.png red heart_red.png
create_bullet heart.png green heart_green.png
create_bullet heart.png blue heart_blue.png
create_bullet heart.png yellow heart_yellow.png
create_bullet heart.png maroon heart_maroon.png
create_bullet heart.png cyan heart_cyan.png
箇条書き記号を生成する際には、元画像の形状または透明度だけが使われるため、どんな形状でも使えます。あなたのウェブサイトに固有の独自の形状を選んでください。また、GIF でも PNG でも、透明度の有無にかかわらず形状を定義するために使える点に注意してください。コマンドは両者を区別しません。ここで示したものより大きな画像を使う場合は、シェード操作の前に適用するぼかしの量を増やすとよいでしょう。そうしないと、画像の端に近い部分しか丸まらないことに気づくかもしれません。また、大きなぼかし値を使うより、複数回ぼかすほうがよいかもしれません(ぼかしの速度を上げるため)。もちろん、何か改良したり別のアイデアがあれば、ほかの人と共有できるよう、ぜひ教えてください。
ロゴを3D化する
この例では、平面的に色付けされた扱いにくい形状のロゴがあり、これを画像処理してはっきりとした3Dの見た目を与えたいとします。これを実現するために、ロゴを使ってハイライトとシャドウを生成し、それらを透明画像に変えて元の画像に重ねます。この効果を実現するために、すべての例ページからさまざまなテクニックを多用しています。この例では、シェード演算子で生成した画像と、さまざまなアルファ合成手法を多用しています。先に進む前にこれらの画像演算子に慣れておくか、何が起きているかをよりよく理解したいときに調べることをお勧めします。
しかし始める前に、このテクニックを適用するための単純なロゴと、そのマスクが必要です。まずはロゴ例の色付き背景となる形状を作りましょう。 |
magick -size 170x100 xc:black \
-fill white -draw 'circle 50,50 13,50' \
-draw 'circle 120,50 157,50' \
-draw 'rectangle 50,13 120,87' \
-fill black -draw 'circle 50,50 25,50' \
-draw 'circle 120,50 145,50' \
-draw 'rectangle 50,25 120,75' \
-fill white -draw 'circle 60,50 40,50' \
-draw 'circle 110,50 130,50' \
-draw 'rectangle 60,30 110,70' \
-gaussian 1x1 -alpha off logo_mask.png
![[IM Output]](../static/img/advanced/logo_mask.png)
次に、このマスクを使ってロゴの単色を切り出し、テキストを加えて、平面的な単色のロゴを生成します。 |
magick logo_mask.png -background red -alpha shape \
-font Candice -pointsize 36 -fill white -stroke black \
-gravity Center -annotate 0 "Ant" \
logo.png
では、オーバーレイ・ハイライトのテクニックを使って3Dの見た目を与えましょう。 |
magick logo.png -alpha extract -blur 0x6 -shade 110x30 -normalize \
logo.png -compose Overlay -composite \
logo.png -alpha on -compose Dst_In -composite \
logo_3D.png
![[IM Output]](../static/img/advanced/logo_3D.png)
影を加えることも、IM が提供する新しいシャドウ生成演算子のおかげで簡単になりました。 |
magick logo_3D.png \( +clone -background navy -shadow 80x4+6+6 \) +swap \
-background none -layers merge +repage logo_3D_shadowed.png
![[IM Output]](../static/img/advanced/logo_3D_shadowed.png)
お遊びとして、最後にロゴを「ざらついた紙」のような背景に重ねて仕上げましょう。ほかにも膨大な数の背景キャンバスを作成できます。そうした例のコレクションについては背景の例を参照してください。 |
magick logo_3D_shadowed.png \
\( +clone +repage -alpha off -fx 'rand()' -shade 120x30 \
-fill grey70 -colorize 60 \
-fill lavender -tint 100 \) \
+swap -composite logo_3D_bg.jpg
反射
反射は比較的簡単に作れますが、しばしばそうは思えません。表面の色や質感といった側面に加え、表面の反射と反射される対象との距離に応じてそうした効果がどう強まるかにも対処しなければなりません。基本的には比較的単純なはずの事柄が、あっという間にかなり複雑なものになります。
では、比較的単純な画像の反射から始めましょう。ここではポケモンのキャラクター、マリルリの画像を使います(右を参照)。お好みで自分の画像に差し替えてください。さて、完全な鏡の反射を作るには、元のオブジェクトを単にコピーして反転し、文脈を与えるために背後に背景を加えるだけです。たとえば次のように。
|
magick pokemon.gif \( +clone -flip \) -append \
-size 100x100 xc:black +swap \
-gravity North -geometry +0+5 -composite reflect_perfect.png
表面の色 - 全体的な減衰
上記で注目すべきは、反射が完全であるために、黒い表面に映った反射のようには本当には見えないということです。それはむしろ、元画像の「鏡のタイル」のようなものであり、実際そのとおりです。普通の浴室の鏡でさえ、当たった光のすべてを反射するわけではなく、それでも入手できる最良の鏡です。そこで反射の第一の規則はこうです。
反射は決して完全ではない。
すべての反射は100%の反射ではなく、そのため表面(あるいは周囲の環境)によって色付けされます。世界は不完全であり、反射はそうした不完全さを非常にうまく強調し、示します。では、もう一度試してみましょう。今度は反射する表面の色で反射を色付けします。これには2通りの方法があります。最も単純な方法は、反射を表面と同じ色で単にカラー化することです。色付けの量は、表面の反射性能がどれだけ良いかによります。色の付いた表面の場合、その性能はたいてい非常に悪いので、大量の色を加える必要があります。黒い表面には「65%」がかなり良好です。 |
magick pokemon.gif \
\( +clone -flip -fill black -colorize 65% \) -append \
-size 100x100 xc:black +swap \
-gravity North -geometry +0+5 -composite reflect_colored.png
![[IM Output]](../static/img/advanced/reflect_colored.png)
ずっと良くなりました…これでようやく反射らしく見えます! 反射を弱めるもうひとつの方法は、反射した画像を半透明、つまり透き通った状態にすることです。たとえば画像のアルファ値を乗算して、元のオブジェクトのおよそ35%だけが見えるようにします。 |
magick pokemon.gif -alpha on \
\( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
-size 100x100 xc:black +swap \
-gravity North -geometry +0+5 -composite reflect_alpha.png
![[IM Output]](../static/img/advanced/reflect_alpha.png)
こちらのほうがむしろ好まれます。表面の色を任意の色、あるいは何らかの色の質感やパターンにできるからです。たとえば、遠い地平線を眺めるで紹介した無限タイリングのテクニックを使って、水平な木の床を生成しましょう。 |
magick tile_wood.gif -set option:distort:viewport 100x100 \
-virtual-pixel tile -distort Perspective \
'0,0 -20,65 96,0 60,40 96,96 120,55 0,96 50,99' \
wooden_floor.png
![[IM Output]](../static/img/advanced/wooden_floor.png)
そして、半透明の反射を伴った画像を、この木の床に重ねます。 |
magick pokemon.gif -alpha on \
\( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
wooden_floor.png +swap \
-gravity North -geometry +0+5 -composite reflect_wood.png
![[IM Output]](../static/img/advanced/reflect_wood.png)
反射するオブジェクトがなければ、木の表面はかなり地味で生気がないように見えますが、何らかのオブジェクトが映ると、床は突然とても高い光沢のある見た目になります!
歪んだ元画像
さて。もう少し凝ったことを試して、画像に3Dの遠近感を持たせてみましょう。 |
magick pokemon.gif -alpha on -virtual-pixel transparent \
+distort Perspective '0,0 0,0 0,64 0,64 64,0 54,10 64,64 54,54' \
\( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
+filter -size 100x100 xc:black +swap \
-gravity North -geometry +0+5 -composite reflect_distort_bad.png
![[IM Output]](../static/img/advanced/reflect_distort_bad.png)
これは明らかに間違っています。画像が歪んでいるように見えますが、元のユーザーに対しては平面のままです。なぜか……
表面に接しているオブジェクトは、その反射にも接する。
当たり前のように思えますが、これを間違える人を見たことがあります。もちろんオブジェクトが表面の上に浮いているなら、接触はしません。これを直すひとつの方法は、元画像とその画像の反射を別々に歪めてから、その結果をレイヤー結合することです。 |
magick pokemon.gif -alpha on -virtual-pixel transparent \
\( -clone 0 \
+distort Perspective '0,0,0,0 0,64,0,64 64,0,54,10 64,64,54,54' \) \
\( -clone 0 -channel A -evaluate multiply .35 +channel \
+distort Perspective '0,0,0,128 0,64,0,64 64,0,54,98 64,64,54,54' \
\) -delete 0 +swap -background none -layers merge \
+filter -size 100x100 xc:black +swap \
-gravity North -geometry +0+5 -composite reflect_distort_sep.png
![[IM Output]](../static/img/advanced/reflect_distort_sep.png)
非常に異なる歪みパラメータの組から分かるように、反射を歪めるのはとても難しくなり得ます。最初の歪みを少し変えるだけで、反射画像のための2つ目の歪みも計算し直さなければならないため、さらに難しくなります。反射した歪みの座標をどう計算すべきかを教えてくれる規則が、あと2つあります。
水平な表面における反射は、常に真下に向かう。
つまり、反射は常にユーザーに向かいます。ユーザーは画像の真正面にいるので、水平な表面のどんな反射も下向き、つまりユーザーの真っ直ぐ手前に向かうことになります。これは物理法則であり、画像を少なくとも半分は現実的に見せたいなら、破りたくないものの一つです。そして最後にもうひとつ、覚えておくべき規則があります。
水平な表面に映った垂直な表面の反射は、
反射されるオブジェクトと同じ高さになる
画像の中でオブジェクトがどれほど「遠く」に見えても、最終画像におけるその反射の高さは、反射されるオブジェクトと同じ高さであるべきです! これは明白ではなく、間違えやすいところです。
これら3つの規則が意味するのは、反射した座標の X 値は同じままで、Y 値が「表面の接触点」を中心に、その点より上にある分だけ下方向に反転される、ということです。
ですから、少し注意すれば、歪めた元画像の座標をもとに、反射の歪み座標を計算できます。さて、これらの規則は、歪んだ画像の反射を単純化できる方法も提供してくれます。まず元画像に反射を追加してから、反射が付いていないかのように元画像を歪め、反射も主画像と一緒に歪ませればよいのです。 |
magick pokemon.gif -alpha on -virtual-pixel transparent \
\( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
+distort Perspective '0,0,0,0 0,64,0,64 64,0,54,10 64,64,54,54' \
-gravity North -crop 100x100+0-5\! \
-background black -compose Over -flatten reflect_distort.png
![[IM Output]](../static/img/advanced/reflect_distort.png)
ご覧のとおり、こちらのほうがずっと簡単で、オブジェクトについて扱う歪みの組も一つだけで済むため、変更もずっと容易になります。また、別の反射を作るために繰り返すのは不可能なような歪みも使えるようになります。たとえば、画像から3Dの弧を生成するなどです。 |
magick pokemon.gif -alpha on -virtual-pixel transparent \
\( +clone -flip -channel A -evaluate multiply .35 +channel \) -append \
+distort Barrel '0,0,0,1 0,0,-.35,1.5 32,32' \
-gravity North -crop 100x100+0-5\! \
-background black -compose Over -flatten reflect_3Darc.png
![[IM Output]](../static/img/advanced/reflect_3Darc.png)
次の節へ進む前に、最後にひとつ。影は一般に反射と同じ規則に従いますが、最後の2つの規則を除きます。影は真下に落ちるとは限らず、光源から離れる方向(遠方の光源では平行)を指します。また、「表面の接触点」から同じ距離になるわけではなく、距離の比は同じになりますが、反射のような1対1の比ではありません。
勾配減衰
ここまでは完全に滑らかな反射面を扱ってきましたが、ほとんどの表面は鏡のような輝きにまで磨かれていません。一見滑らかな表面も、より小さなスケールでは実は滑らかではなく、これが反射される光に影響します。その効果はまた、反射される光がオブジェクトと反射点との間を移動しなければならない距離が増えるほど強まります。ですから……
反射は、元画像から離れるほど
弱く、より歪んだものになる。
距離効果を作る最も単純な方法は、表面から離れるほど反射を弱くすることです。これには通常、画像に近いところでは反射を少し明るめにしておくのが許容されます。 |
magick pokemon.gif -alpha on \
\( +clone -flip \
-size 64x28 gradient:gray40-black \
-alpha off -compose CopyOpacity -composite \
\) -append \
-gravity North -crop 100x100+0-5\! \
-background black -compose Over -flatten reflect_attenuated.png
![[IM Output]](../static/img/advanced/reflect_attenuated.png)
これはかなりうまく機能し、生成がとても簡単なので、反射を生成するのにかなり一般的な方法です。このテクニックがうまくいくのは、反射される光のかなりの割合が完全な反射ではなく、むしろ全体的な環境のものだからです。元画像から離れるほど、元画像の反射は少なくなります。
ぼかし減衰
実際の元オブジェクトの反射を構成する成分は、単に距離とともに弱まるだけではありません。実際には、反射する表面は一般にあまり滑らかではないため、反射は距離とともにより不鮮明に、ぼやけて、歪んでいきます。これはマクロな歪みではなく、ごく小さな顕微鏡レベルでの歪みです。鏡面反射のハイライトを生み出すのと同じ効果です。つまり、反射の源に近いところでは比較的シャープでいられますが、源から離れるほど画像はよりぼやけていきます。IM バージョン 6.5.5-0 より前は、これは実現が非常に難しいことでした(可能ではありましたが、多くの工夫なしにはできませんでした)。しかし今では、可変ぼかしマップを使って、元画像からの距離に基づいて反射をかなり簡単にぼかせます。ただしこれがうまく機能するには、オブジェクトの周りにぼかしを広げるための透明な縁取りを加えるのが良い考えです。これらの例では、反射全体が見えるように最終画像を拡張しているので、その効果がよく分かるはずです。 |
magick pokemon.gif -alpha on \
-background None -gravity South -extent 100x100 \
\( +clone -flip -channel A -evaluate multiply .35 +channel \
-size 100x100 gradient:gray5-white \
-compose Blur -set option:compose:args 10 -composite -compose Over \
\) -append -trim +repage \
-gravity North -crop 100x140+0-5\! \
-background black -compose Over -flatten reflect_blurred.png
![[IM Output]](../static/img/advanced/reflect_blurred.png)
反射のぼかしは、垂直方向に引き伸ばしたぼかし楕円を使うことで、さらに強められます。たとえば、単純な円形のぼかし「20」の代わりに、楕円のぼかし引数「10x30」を使います。「ぼかし減衰」を「勾配減衰」と組み合わせれば、典型的な、あまり磨かれていないが滑らかな表面の反射の、非常に現実的な反射が得られ始めます。 |
magick pokemon.gif -alpha on \
-background None -gravity South -extent 100x100 \
\( +clone -flip \
\( -size 100x64 gradient:'rgba(0,0,0,0.6)-none' \
-size 100x36 xc:none -append \
\) -compose Dst_In -composite \
\( -size 100x100 gradient:gray5-white \
\) -compose Blur -set option:compose:args 4x8 -composite \
\) -append -trim +repage \
-gravity North -crop 100x140+0-5\! \
-background black -compose Over -flatten reflect_blur_atten.png
![[IM Output]](../static/img/advanced/reflect_blur_atten.png)
平らな表面について、これより良い反射画像を得るのは難しいでしょう。
Future: To add examples of...
Surface Texture effects
frosted - or non smooth surfaces (small scale randomised distortions)
rippled - water reflections
(very little blur or attenuation, just stronger macro distortion)
ジグソーピース
| これまでに手伝うよう頼まれた中で最も興味深かったことのひとつが、より大きな画像から変わった形の「ジグソー」ピースを切り出して加工することでした。実は Theo van Hoesel 氏、別名「Mr Jigsaw」が、たくさんの別々のピースを、さまざまな回転角度で大量に生成したいと考えていました。以下はその議論から発展したもので、ピースは一つだけですが、適切なテンプレートの組があれば、どんなピースのパターンでも生成できます。 右に示すのは、ドイツ・ベルリンのホロコースト記念碑の写真の 800x600 画像へのリンク付きサムネイルです。この写真は2006年4月のヨーロッパ旅行中に撮影しました。本当に難しいジグソーパズルを作るのに最高の画像に見えます。そしてその下にあるのが、上の画像から抽出するジグソーピースのテンプレート画像です。これはそうした画像の組の一部でした。ジグソーピースの完全な組には、縁や角を含めて、16×12の配列で192枚のマスクが含まれます。この特定のジグソーピースは 100x100 ピクセルのマスク で、800x600 ピクセルの画像 上で +365+96 オフセット で使うよう設計されています。これらの数値は、組み合わさる多種多様なピースの大きな組を持っている場合にのみ重要です。これを行う予定がないなら、もちろん好きなオフセットを使ってかまいません。 | ![]() |
|
|---|---|---|
![]() |
||
| 私自身、どんな画像でもジグソーにできるような、そうしたジグソーの組をいくつも集めてきました。そしてこれはまさに Theo van Hoesel 氏が、彼のウェブサイトで実際に行っていることです。実際のジグソーパズルを作るなら、オフセット情報は非常に重要です。それは元画像におけるそのピースの位置と配置を特定するからです。ですので、私はこの情報を保持するよう努めます。マスクのオフセットは、形状の周りの余分な詰め物のために、場合によっては負になることもあるので、この状況を扱うために画像コマンドをテストして調整する必要があるかもしれません。余分な詰め物そのものによって、切り出したジグソーピースのサイズやオフセットを変えることなく、最終画像に回転、厚み、影の効果を簡単に加えられます。 しかしまず、このテンプレートを輪郭に変換しましょう。 |
magick jigsaw_tmpl.png -edge .5 -blur 0x.5 jigsaw_edge.png
![[IM Output]](../static/img/advanced/jigsaw_edge.png)
これを画像に重ねれば、ジグソーピースを形作るために何が切り出されるのか、おおよその見当をつけられます。 |
magick holocaust_md.jpg \
\( jigsaw_edge.png -negate \) -geometry +365+96 \
-compose multiply -composite \
-crop 100x100+365+96 +repage jigsaw_outline.png
![[IM Output]](../static/img/advanced/jigsaw_outline.png)
通常、ジグソーを生成するときにこれは行いませんが、ピースの位置が重要でない(より大きなパズルの一部でない)場合には役立ちます。そうであれば、そのジグソーピースのためにより良い内容を選べるよう、オフセットを調整できます。 | 「[-edge](https://imagemagick.org/command-line-options/#edge)」の動作のしかたのために、上で生成したジグソーの輪郭は、マスクされた(白い)マスキング画像の領域の内側にあります。後でこの輪郭を活用したい場合、これは重要になり得ます。
---|---
さて、ジグソーの形状と、切り出すピースのオフセットが手に入りました。では切り出して、回転もさせましょう。 |
magick holocaust_md.jpg \
-crop 100x100+365+96\! -background none -flatten +repage \
\( jigsaw_tmpl.png -alpha off \) -compose CopyOpacity -composite \
-rotate -20 -gravity center -crop 100x100+0+0 +repage \
jigsaw_cutout.png
![[IM Output]](../static/img/advanced/jigsaw_cutout.png)
元画像を、テンプレート形状が覆う領域まで切り抜いた点に注意してください。マスクの外側の領域は必要なく、早めに取り除くことで画像処理が速くなります。また、ビューポート切り抜きに続けて「[-flatten](https://imagemagick.org/command-line-options/#flatten)」を使う特別な使い方にも注目してください。この切り抜き方法によって、縁や角のピースのマスクを使う場合でも、100x100 ピクセルの画像からテンプレートを「切り出す」ことが保証され、画像の上端や左端の上やその近くにあるピースの負のオフセットも扱えます。回転もこの時点で行います。ほとんどの加工は特定の方向に基づいて効果を加えるからです。その回転の結果は中央で切り抜かれます。この演算子は通常、使う回転角度に応じて結果の画像サイズを拡大するので、そうさせたくないからです。最初の加工は、ピースに少し面取りした、つまり丸みを帯びたハイライトを縁の周りに与えることです。これはシェード・ハイライト・オーバーレイのとおりで、ハイライトの生成のしかたを細かく制御できます(4つの別々の係数)。 |
magick jigsaw_cutout.png \
\( +clone -channel A -separate +channel -negate \
-background black -virtual-pixel background \
-blur 0x2 -shade 120x21.78 -contrast-stretch 0% \
+sigmoidal-contrast 7x50% -fill grey50 -colorize 10% \
+clone +swap -compose overlay -composite \) \
-compose In -composite jigsaw_bevel.png
![[IM Output]](../static/img/advanced/jigsaw_bevel.png)
実際のジグソーでは、この面取りはジグソーピースを機械でプレス裁断した結果です。それはまたピースに少しへこみを与えるので、ピースを組み合わせ直すと、裁断の跡がまだ見えます。では、ピースに厚みを加えましょう。これは私が見つけた中で最良かつ最速の方法ですが、あまり良いテクニックだとは思っていません。もっと良いものを見つけたら、ぜひ教えてください。 |
magick jigsaw_bevel.png \
\( +clone -fill DarkSlateGrey -colorize 100% -repage +0+1 \) \
\( +clone -repage +1+2 \) \( +clone -repage +1+3 \) \
\( +clone -repage +2+4 \) \( +clone -repage +2+5 \) \
-background none -compose DstOver -flatten \
jigsaw_thickness.png
magick jigsaw_thickness.png \
\( +clone -background Black -shadow 50x3+4+4 \) \
-background none -compose DstOver -flatten \
jigsaw_shadow.png
![[IM Output]](../static/img/advanced/jigsaw_shadow.png)
上記のコマンドはすべて単一のシェルスクリプトに簡単に保存でき、私も自分用にそうしています。スクリプト「[jigsaw](../static/img/scripts/jigsaw) 」は、元の写真、テンプレート、出力先という3つの画像パラメータに加え、上で示したさまざまな加工を有効にする数多くのオプションを取ります。ジグソーの形状を使う必要すらありません。どんなマスクテンプレートでも、適切な効果を加えながら画像の一部を切り出すのに使えます。上記のものと私のスクリプト版との最大の違いは、スクリプトがデフォルトで、切り出した画像のオフセットを記録しつつ、最終画像をできるだけ小さく保つことです。このオフセット位置を保持することで、単純な「[-mosaic](https://imagemagick.org/command-line-options/#mosaic)」や「[-flatten](https://imagemagick.org/command-line-options/#flatten)」を使って複数のピースを重ね合わせ直し、興味深い効果を生み出せます(下の最後の例を参照)。このスクリプトをさまざまな方法で使う例をいくつか示します。
jigsaw -o +365+96 -m null: jigsaw_tmpl.png jigsaw_mask.png
magick -size 800x600 xc:gray miff:- |\
jigsaw -r 30 -l -h -s miff:- jigsaw_mask.png jigsaw_grey.png
jigsaw -r -60 -h -t 4 -s holocaust_md.jpg jigsaw_mask.png jigsaw_piece.png
magick jigsaw_cnr.png -resize 50% -flip -flop -repage 120x90 \
-background black -flatten -flip -flop jigsaw_cnr_tmpl.png
jigsaw -t 3 -s -r 15 -d +15+7 \
holocaust_tn.gif jigsaw_cnr_tmpl.png holocaust_piece_tn.png
magick jigsaw_cnr_tmpl.png -negate png:- |\
jigsaw -t 3 -s holocaust_tn.gif png:- holocaust_puzzle_tn.png
magick holocaust_puzzle_tn.png holocaust_piece_tn.png \
-background none -mosaic holocaust_jigsaw_tn.png
最後の画像は、ありうるジグソーのサムネイル様式の出発点です…これは角のジグソーピースを取り、いくらか拡大縮小と拡張を行って、マスクをフルサイズの画像テンプレートマスクに変換します。これを使って、既存のサムネイルから角のピースを切り出すだけでなく、反転させて残りの画像も生成します。この2つの画像を重ね合わせると、なかなか凝った見た目のジグソーのサムネイルができます。ピース作成のオプションに「-d +15+7」を使っている点に注目してください。これは生成された PNG 画像の「ページオフセット」を、画像内の元の位置から少しだけずらし、示された結果を簡単かつ手軽に生み出します。利用できるほかのオプションについては、スクリプト自体を参照してください。 | _生成されるページオフセットは負になり得て、任意のソフトシャドウ効果を含むこともあるので、抽出したピースには PNG 画像のみを使うことをお勧めします。GIF 画像は負のページオフセットや影の効果を扱えず、透明度が関わるときに滑らかでアンチエイリアスのかかった縁も生成しません。
一般に、最終画像以外のすべてで GIF(および JPEG)画像は避けるべきです。詳しくは一般的な画像形式の例ページを参照してください。_
---|---
ジグソーパズルのテンプレートに限らず、どんな形状のマスクでも、どんな画像とでも使えます。何ができたか教えてください。「[jigsaw](../static/img/scripts/jigsaw)」スクリプトの開発は、まだ完全には終わっていません。ハイライト、厚み、影の効果のためのより良い制御と、できれば「マスク反転」オプションが欲しいからです。とはいえ、基本的には完成して動作するプログラムで、自由に使ってかまいません。ウェブページで使うならリンクを張り返してくれると嬉しいです :-) PerlMagick の API スキルがある方は、上記のスクリプトを高速化のために PerlMagick へ変換してみて、それを私に提出してくれれば、ほかのみんなも使えるようになり、あなたが IM をどれだけ使いこなせるかも分かります。さらなる提案やアイデアはいつでも歓迎します。
マスクのコレクション(仮想ピクセルのオフセットの有無にかかわらず)を使って、画像からすべてのピースを切り出したいだけなら、以下のコマンドで すべて を非常に素早く実行できます。
magick mask_*.png -set filename:mask %t -alpha shape \
null: image.jpg -compose In -layers composite \
pieces_%[filename:mask].png
結果として得られる各「pieces_mask_*.png」画像には、元画像から取った適切な画像が正しいオフセットで含まれるだけでなく、そのオフセットも最終画像に保持されます。これはマルチレイヤー合成を使って、特別な「null:」マーカー画像の左側にあるすべての画像を、右側にある単一の画像と結合することで実現します。おまけに、使ったマスクのファイル名を(最終的な画像ファイル形式も含めて)ピース画像のファイル名に組み込むので、どのピースがどれなのかを識別するのがずっと簡単になります。(詳しくはファイル名のパーセントエスケープを参照してください。マスクは元画像全体を完全に覆う必要はありませんが、ピースの間に空きや隙間を残すべきではない点に注意してください。もちろん、ちゃんとしたジグソーであれば、すべてのマスクが正しく整列し、Dst_Out 合成の例に示すような継ぎ目のない全体を生み出すべきです。
「ジェル」効果
上で使った3Dの陰影は、ハイライトとシェード効果でできることのほんの始まりにすぎません。「-shade」の出力にさまざまなヒストグラム調整を行うことで、膨大な範囲の可能性が広がります。再現できるそうした効果のひとつが「ジェル」効果として知られるもので、「Photoshop のハウツー系ウェブサイトでよく見かけます(「Gel Effects Tutorial」でググってください)。まず必要な形状を作りましょう。これは事前に用意した画像でも、上で3Dの箇条書き記号の「heart」でやったように「Dings」フォントから抽出したものでもかまいません。ここでは、ボタン用に単純な楕円形を使いましょう。 |
magick -size 100x60 xc:none \
-fill red -draw 'circle 25,30 10,30' \
-draw 'circle 75,30 90,30' \
-draw 'rectangle 25,15 75,45' \
gel_shape.png
![[IM Output]](../static/img/advanced/gel_shape.png)
では、大きく改変したぼかしシェード操作を使って、色付けした形状にシャープな「ジェル」のハイライトを加えましょう。 |
magick gel_shape.png \
\( +clone -alpha extract -blur 0x12 -shade 110x0 -normalize \
-sigmoidal-contrast 16,60% -evaluate multiply .5 \
-roll +5+10 +clone -compose Screen -composite \) \
-compose In -composite gel_highlight.png
![[IM Output]](../static/img/advanced/gel_highlight.png)
透明度(マット)チャンネルのコピーを丸めるためにぼかしてから、それに「-shade」を適用しました。このシェードは「高さ」も「方位」角も持たない光源を使ったので、基本的にはぼかした形状の片側だけグレー色のハイライトが得られ、それ以外はすべて黒になります。このハイライトのグレースケールは、その後「-sigmoidal-contrast」演算子で調整(シャープ化)され、ハイライト領域のサイズを縮め(「60%」のしきい値レベル)、その縁をシャープにしました(非常に高い「16」という指数係数を使って)。これほど高い指数値だと、演算子はほとんど「ぼやけた」「-threshold」演算子のように振る舞い、元画像の形状に基づいた平らな色の領域を生み出します。この滑らかなコントラスト/しきい値関数について詳しくはシグモイド非線形コントラストを参照してください。そして最後に、ハイライトのレベルが「-evaluate」を使ってすべての色を望むハイライトレベルで乗算することで調整され、その後「-roll」を使って、その位置を整形された領域へとずらしました。さて、ハイライトは黒の上のグレーなので(黒は変えずに残す)、「[Screen](compose.html#screen)」アルファ合成を使って、与えたグレーレベルの分だけ非黒領域を明るくします。あとは縁を少し暗くするだけです。 |
magick gel_highlight.png \
\( +clone -alpha extract -blur 0x2 -shade 0x90 -normalize \
-blur 0x2 +level 60,100% -alpha On \) \
-compose Multiply -composite gel_border.png
![[IM Output]](../static/img/advanced/gel_border.png)
今回は縁を暗くするために垂直方向に照らした「-shade」を使った点に注意してください。これにより、変えずに残したい領域が白色になります。そこで、反転レベル調整を使ってグレースケールを調整し、アルファ抽出法で保存しておいた透明度を復元したうえで、「[Multiply](compose.html#multiply)」アルファ合成を使って、効果のかかった縁を暗くできました。楕円形の「ジェル」ボタンを、テキストと影の効果で仕上げましょう。 |
magick gel_border.png \
-font Candice -pointsize 24 -fill white -stroke black \
-gravity Center -annotate 0 "Gel" -trim -repage 0x0+4+4 \
\( +clone -background navy -shadow 80x4+4+4 \) +swap \
-background none -flatten gel_button.png
「アクア」または「バブル」効果
完全な3Dの「-shade」(30度の照明を使用)の色付けを調整して、「アクア」の水効果を生み出すこともできます。しかしこのためには、「Gimp」や「Photoshop」のような GUI グラフィックプログラムで行うのと似た方法で、ヒストグラム調整を行う必要があります。私がたどっている手順が分かるよう、まずはこれをゆっくり段階を追って行います。まず使用する画像を作りましょう。ここでは曲線的な文字 A です。 |
magick -background none -fill DodgerBlue \
-font Candice -pointsize 72 label:A -trim +repage \
-bordercolor None -border 1x1 \
aqua_shape.png
![[IM Output]](../static/img/advanced/aqua_shape.png)
画像の周りに1ピクセルの透明な縁を加えた点に注意してください。これにより、次の処理ステップがほんの少し簡単になります。次に、この整形した画像の丸みのあるシェードを生成する必要があります。 |
magick aqua_shape.png \
-alpha Extract -blur 0x8 -shade 130x30 -alpha On \
-background gray50 -alpha background -auto-level \
aqua_shade.png
![[IM Output]](../static/img/advanced/aqua_shade.png)
アルファ背景を扱う妙な行は、透明領域の隠れた色を中間調のグレーにリセットして、色の正規化に影響しないようにするためのものです。これは非常に重要になり得ます。次に、このシェードを、水やガラスのバブルによって光が歪められる様子に漠然と似た「照明効果」に変換します。 |
magick aqua_shade.png \
-function polynomial 3.5,-5.05,2.05,0.3 \
aqua_lighting.png
![[IM Output]](../static/img/advanced/aqua_lighting.png)
多項式関数は、画像のカーブ調整に使われます。全体的な効果を与えるのはこの関数であり、これを決めるのは難しいことがあります。これを行うために、私はこの「カーブ」に必要な制御点を、「[**im_fx_curves**](../static/img/scripts/im_fx_curves)」という IM のサポートシェルスクリプトに渡しました。すると、これらの制御点に合う「カーブ」に必要な多項式方程式の「係数」が返されます。
im_fx_curves -c -p 0,30 100,80 50,50 80,50 > aqua_coeffs.txt
| | | ![[Coeffs]](../static/img/advanced/aqua_coeffs.txt.gif)
この照明効果の最後の調整は、照明効果の縁を暗くすることです。 |
magick aqua_lighting.png \
\( +clone -alpha extract -blur 0x2 \) \
-channel RGB -compose multiply -composite \
aqua_light+edge.png
![[IM Output]](../static/img/advanced/aqua_light+edge.png)
これで陰影オーバーレイは完成です。あとはハードライト合成を使って、これを元画像に適用するだけです。 |
magick aqua_shape.png aqua_light+edge.png \
-compose Hardlight -composite aqua_result.png
![[IM Output]](../static/img/advanced/aqua_result.png)
結果として得られる画像の全体的な色が、実は元の形状の元の色になっている点に注目してください。実際、これを多色の画像に適用しても、まったく問題ありません。では、最初の形状画像の作成も含めて、上記のすべてのステップを1つのコマンドで繰り返してみましょう。
magick -background none -fill DodgerBlue \
-font Candice -pointsize 96 label:'Aqua Text' -trim +repage \
\
\( +clone -bordercolor None -border 1x1 \
-alpha Extract -blur 0x8 -shade 130x30 -alpha On \
-background gray50 -alpha background -auto-level \
-function polynomial 3.5,-5.05,2.05,0.3 \
\( +clone -alpha extract -blur 0x2 \) \
-channel RGB -compose multiply -composite \
+channel +compose -chop 1x1 \
\) \
-compose Hardlight -composite aqua_text.png
上記を調べれば、これまでに概説したすべてのステップが、照明画像を生成するために適用され、それが元画像に合成されているのが分かるはずです。
タイル化可能な星と彗星
私はさまざまな用途のために、ランダムな星空(明るさが変わる星を含む)のタイルを作りたいと思いました。これは、これに挑む試みを少しずつ改良していった結果です。ランダムノイズ画像を使って自身を間引き、まだら模様を生成します。 |
magick -size 100x100 xc: +noise Random -channel R -threshold 5% \
-negate -channel RG -separate +channel \
-compose multiply -composite speckles.gif
![[IM Output]](../static/img/advanced/speckles.gif)
このパターンはきらめきアニメーション効果の基礎ですが、ほかの効果の出発点でもあります。たとえば星を作るには、よりリアルにするために、ランダムな「まだら」模様をもう少し変える必要があります。 |
magick -size 100x100 xc: +noise Random -channel R -threshold 1% \
-negate -channel RG -separate +channel \
\( +clone \) -compose multiply -flatten \
-virtual-pixel tile -blur 0x.4 -contrast-stretch .8% \
stars.gif
![[IM Output]](../static/img/advanced/stars.gif)
まだらのマスク(「R」チャンネル)だけでなく、星の明るさの画像(「G チャンネル)も2回乗算している点に注意してください。これによりピクセルの明るさに二乗の減衰が生じ、本物の夜空のように、明るい星よりも暗い星が多く存在するようになります。その後、星の明るさに基づいて星のサイズをぼかしで拡大します。これは星が天文学者の写真乾板に焼き付くのに似た効果を生み、いっそうリアルになります。ぼかし値が大きいほど効果も大きくなります。最後の「[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)」が結果を見える状態に戻します。2つのランダムノイズ画像(一方はマスク用、もう一方は星の色用)を使うことで、単純なグレースケールの星ではなく、ランダムに色付けされた星を生成できます。 |
magick -size 100x100 xc: +noise Random -channel R -threshold 1% \
-negate -channel RG -separate +channel \
\( xc: +noise Random \) -compose multiply -flatten \
-virtual-pixel tile -blur 0x.4 -contrast-stretch .8% \
stars_colored.gif
![[IM Output]](../static/img/advanced/stars_colored.gif)
ただしこれにはもっと手を加える必要があるかもしれません。色を単に線形分布に対して乗算するのではなく、色の強度を直接二乗する必要があるからです。とはいえ機能はしますし、さらなる開発の出発点になります。色はランダムである必要はなく、星のためにほかの画像から簡単に得ることもできる点に注意してください。たとえば、星の色そのものを、最終的な背景に使う画像から取ることもできます。さて、星空ジェネレータができたので、単に「[-motion-blur](https://imagemagick.org/command-line-options/#motion-blur)」を使うだけで、降り注ぐ星の場を作れます! |
magick -size 100x100 xc: +noise Random -channel R -threshold .4% \
-negate -channel RG -separate +channel \
\( +clone \) -compose multiply -flatten \
-virtual-pixel tile -blur 0x.4 -motion-blur 0x20+45 -normalize \
star_fall.gif
![[IM Output]](../static/img/advanced/star_fall.gif)
もちろん、星の数はもっと少なく、星の明るさの「減衰」ももっと少なくしたいところです。画像を極座標歪みさせることで、彗星が一点へ飛び込んだり、らせんを描いて入っていったりするようにできます! |
magick -size 250x100 xc: +noise Random -channel R -threshold .4% \
-negate -channel RG -separate +channel \
\( +clone \) -compose multiply -flatten \
-virtual-pixel Tile -background Black \
-blur 0x.6 -motion-blur 0x15-90 -normalize \
+distort Polar 0 +repage star_inward.gif
magick -size 250x100 xc: +noise Random -channel R -threshold .4% \
-negate -channel RG -separate +channel \
\( +clone \) -compose multiply -flatten \
-virtual-pixel Tile -background Black \
-blur 0x.6 -motion-blur 0x15-60 -normalize \
+distort Polar 0 +repage star_spiral.gif
![[IM Output]](../static/img/advanced/star_spiral.gif)
ここでは星を6方向(対になって)にモーションブラーし、それらを結合して、ガラスのレンズで得られるような「星の輝き」の場を作ります。 |
magick -size 100x100 xc: +noise Random -channel R -threshold .2% \
-negate -channel RG -separate +channel \
\( +clone \) -compose multiply -flatten \
-virtual-pixel tile -blur 0x.3 \
\( -clone 0 -motion-blur 0x10+15 -motion-blur 0x10+195 \) \
\( -clone 0 -motion-blur 0x10+75 -motion-blur 0x10+255 \) \
\( -clone 0 -motion-blur 0x10-45 -motion-blur 0x10+135 \) \
-compose screen -background black -flatten -normalize \
star_field.gif
![[IM Output]](../static/img/advanced/star_field.gif)
暗い星は小さな点を生むだけで「星の輝き」のようなものはほとんど生まないのに対し、より大きく明るい星は非常に大きな「星の輝き」を生むことに注目してください。さて、最も明るい星の周りにフレアの「リング」を生み出すように「sinc()」型のぼかしを加える方法を見つけられれば、素晴らしい星空ジェネレータになります。プラズマ背景を加えれば、星雲やガス雲の偽の天体写真さえ生成できます。上記をプラズマきらめきアニメーションと組み合わせれば、クリスマスの装飾のような星の組を作れます。 |
magick -size 100x100 xc: +noise Random -separate \
null: \
\( xc: +noise Random -separate -threshold 50% -negate \) \
-compose CopyOpacity -layers composite \
null: \
plasma:red-firebrick plasma:red-firebrick plasma:red-firebrick \
-compose Screen -layers composite \
null: \
\( xc: +noise Random -channel R -threshold .08% \
-negate -channel RG -separate +channel \
\( +clone \) -compose multiply -flatten \
-virtual-pixel tile -blur 0x.4 \
\( -clone 0 -motion-blur 0x15+90 -motion-blur 0x15-90 \) \
\( -clone 0 -motion-blur 0x15+30 -motion-blur 0x15-150 \) \
\( -clone 0 -motion-blur 0x15-30 -motion-blur 0x15+150 \) \
-compose screen -background black -flatten -normalize \) \
-compose multiply -layers composite \
-set delay 30 -loop 0 -layers Optimize stars_xmas.gif
![[IM Output]](../static/img/advanced/stars_xmas.gif)
上記のテクニックは、実現できることのほんの始まりにすぎません。いくつかの単純なアニメーション技法を使えば、画像に加えられるきらめきやランダムなフレアを作れます。この単純な例のひとつが、星の輝きを生成する単純なシェルスクリプト「[star_field](../static/img/scripts/star_field) 」を使って、GIF アニメーションの例で提供されています。この星ジェネレータで何ができるでしょうか? 挑戦:
- 星ではなくきらめきを生成する。最初のまだら場をマスクで(たとえば乗算で)制限する必要があります。きらめきと星はどちらも、その後「screen」合成を使って画像に重ねられます。
- マスクした「まだら場」を使って、重ねるための星の輝きを生成する。完全な星の輝きではなく種をマスクすることで、輝きの「光線」がマスク領域を出て画像のほかの部分に重なることができます。つまり、光線は単に「切り取られる」のではありません。
- ランダムな星の輝きのアニメーションを作る。これには、星の輝きの単一の場をアニメーションさせる必要があるかもしれません(おそらく光線を回転させて)。
- 星の輝きのアニメーションをいくつか生成すれば、それらを結合して、異なる場所からの重なり合う星の輝きの連なりを作れます。
- ヒストグラム伸張としきい値処理によって、画像の最も明るい部分に単一の「種」点を見つける。次に、マスク領域に当たるものが見つかるまで、単一のピクセルを選んでいきます。
- 平らに陰影付けされた形状の縁に星を作る。
上記の挑戦のいずれかをやり遂げたり、星ジェネレータをほかの目的に使ったりしたら、ぜひ私と IM コミュニティのみんなに教えてください。
放射状フレア
放射状フレアを生成する実験です。極座標歪みを行う前の最初の画像の幅が、基本的に生成される光線の数を決める点に注意してください。
magick -size 100x1 xc: +noise Random -channel G -separate +channel \
-scale 100x100\! +write flare_1a.png \
\( -size 100x100 gradient:'gray(100%)' -sigmoidal-contrast 10x50% \) \
-colorspace sRGB -compose hardlight -composite +write flare_1b.png \
-virtual-pixel HorizontalTileEdge -distort Polar -1 \
flare_1_final.png
表示用に中間画像を保存するために「[+write](https://imagemagick.org/command-line-options/#write)」を使っている点に注意してください。これは複雑な画像処理とデバッグで詳しく説明しているデバッグ技法です。複数のオーバーレイを使って異なる見た目のフレアを実現する、もうひとつの例です。関わるステップを示す中間のデバッグ用・例示用画像を生成するために使われている技法に注目してください。
magick -size 100x1 xc: +noise Random -channel G -separate +channel \
-size 100x99 xc:black -append -motion-blur 0x35-90 \
\( -size 100x50 gradient:'gray(0)' \
-evaluate cos .5 -sigmoidal-contrast 3,100% \
-size 100x50 xc:'gray(0)' -append \) \
\( -size 1x50 xc:'gray(0)' \
-size 1x1 xc:'gray(50%)' \
-size 1x49 xc:'gray(0)' \
-append -blur 0x2 -scale 100x100\! \) \
\
-scene 10 +write flare_2%x.png \
\
-background 'gray(0)' -compose screen -flatten +write flare_2f.png \
\
-virtual-pixel HorizontalTileEdge -distort Polar -1 \
-colorspace sRGB flare_2_final.png
フレア画像の生成に極座標歪みを使う際の大きな問題は、光線が半径とともに太くなることです。本当は、暗くなるにつれて光線をおおむね一定の幅に保つか、少なくとも細くしたいところです。アイデアや指針を歓迎します この種の画像では、色の色付けも重要になり得ます。たとえばここでは、中間調の色を色付けするで青に色付けしています。 |
magick flare_2_final.png -fill SkyBlue -tint 100% flare_2_color.png
![[IM Output]](../static/img/advanced/flare_2_color.png)
「[-tint](https://imagemagick.org/command-line-options/#tint)」操作に使うパーセンテージは、光線とフレアリングの強度を調整するのにも使えますが、画像の白い中心部分はあまり変えません。これらの例は、IM フォーラムの議論放射状フレアをマスクに使うでさらに発展させられました。
![[IM Output]](../static/img/advanced/ball.gif)
![[IM Output]](../static/img/advanced/ball_grey.gif)
![[IM Output]](../static/img/advanced/ball_red.gif)
![[IM Output]](../static/img/advanced/ball_green.gif)
![[IM Output]](../static/img/advanced/ball_blue.gif)
![[IM Output]](../static/img/advanced/ball_yellow.gif)
![[IM Output]](../static/img/advanced/ball_maroon.gif)
![[IM Output]](../static/img/advanced/ball_cyan.gif)
![[IM Output]](../static/img/advanced/square.gif)
![[IM Output]](../static/img/advanced/square_grey.gif)
![[IM Output]](../static/img/advanced/square_red.gif)
![[IM Output]](../static/img/advanced/square_green.gif)
![[IM Output]](../static/img/advanced/square_blue.gif)
![[IM Output]](../static/img/advanced/square_yellow.gif)
![[IM Output]](../static/img/advanced/square_maroon.gif)
![[IM Output]](../static/img/advanced/square_cyan.gif)
![[IM Output]](../static/img/advanced/asterix.gif)
![[IM Output]](../static/img/advanced/asterix_grey.gif)
![[IM Output]](../static/img/advanced/asterix_red.gif)
![[IM Output]](../static/img/advanced/asterix_green.gif)
![[IM Output]](../static/img/advanced/asterix_blue.gif)
![[IM Output]](../static/img/advanced/asterix_yellow.gif)
![[IM Output]](../static/img/advanced/asterix_maroon.gif)
![[IM Output]](../static/img/advanced/asterix_cyan.gif)
![[IM Output]](../static/img/advanced/heart.png)
![[IM Output]](../static/img/advanced/heart_grey.png)
![[IM Output]](../static/img/advanced/heart_red.png)
![[IM Output]](../static/img/advanced/heart_green.png)
![[IM Output]](../static/img/advanced/heart_blue.png)
![[IM Output]](../static/img/advanced/heart_yellow.png)
![[IM Output]](../static/img/advanced/heart_maroon.png)
![[IM Output]](../static/img/advanced/heart_cyan.png)
![[IM Output]](../static/img/advanced/logo.png)
![[IM Output]](../static/img/advanced/logo_3D_bg.jpg)
![[IM Output]](../static/img/advanced/reflect_perfect.png)
![[photo]](../static/img/img_photos/holocaust_tn.gif)
![[IM Output]](../static/img/images/jigsaw_tmpl.png)
![[IM Output]](../static/img/advanced/jigsaw_thickness.png)
![[IM Output]](../static/img/advanced/jigsaw_mask.png)
![[IM Output]](../static/img/advanced/jigsaw_grey.png)
![[IM Output]](../static/img/advanced/jigsaw_piece.png)
![[IM Output]](../static/img/images/jigsaw_cnr.png)
![[IM Output]](../static/img/advanced/jigsaw_cnr_tmpl.png)
![[IM Output]](../static/img/advanced/holocaust_piece_tn.png)
![[IM Output]](../static/img/advanced/holocaust_puzzle_tn.png)
![[IM Output]](../static/img/advanced/holocaust_jigsaw_tn.png)
![[IM Output]](../static/img/advanced/gel_button.png)
![[IM Output]](../static/img/advanced/aqua_text.png)
![[IM Output]](../static/img/advanced/star_inward.gif)
![[IM Output]](../static/img/advanced/flare_1a.png)
![[IM Output]](../static/img/advanced/flare_1b.png)
![[IM Output]](../static/img/advanced/flare_1_final.png)
![[IM Output]](../static/img/advanced/flare_2a.png)
![[IM Output]](../static/img/advanced/flare_2b.png)
![[IM Output]](../static/img/advanced/flare_2c.png)
![[IM Output]](../static/img/advanced/flare_2f.png)
![[IM Output]](../static/img/advanced/flare_2_final.png)