ImageMagickの例 --
高度なテクニック

目次
ImageMagickの例 はじめに と 目次
   図形から3Dの箇条書きを作る    スクリプトを使って大量の画像を生成する
3Dグレースケールシェード画像の色合い調整と形状変更
ロゴを3Dにする 透明なオーバーレイを使用して、基本的な形状の画像に色合いを付ける
反射 さまざまな種類の表面反射を追加する。
ジグソーパズル 写真から変わった形のピースを切り取り、強調する
「ジェル」効果 ハイライトのサイズ、明るさ、シャープさを調整する
'Screen' と 'Multiply' 合成を使用した明暗調整
「アクア」効果 'curves'を使用してハイライトを調整する。
タイル状の星と彗星 ランダムな点。
「何てことだ!星でいっぱいだ! -- 2001年宇宙の旅」
放射状フレア 中心点の周りにランダムな光線とリングを生成する。
このページでは、IMの基本的な画像操作を超えて、複合的な画像操作効果を生み出すために複数のテクニックを使用する非常に大規模な例を提供します。主なテクニックは上記のインデックスにまとめられています。フォントテンプレートの作成、画像の凝ったラベル付け、マスクの使用など、他のページでも多くのテクニックが紹介されていますが、これらのページでは、それらのテクニックを組み合わせて、より複雑な効果を生み出す方法を示しています。

図形から3Dの箇条書きを作成する -- スクリプトによるアプローチ

Webサイトのリストには、多くの「箇条書き」画像がWeb上で入手できます。しかし、独自の3Dオブジェクトを生成して、Webサイト全体を特定のスタイルに適合させることができます。これらをすべて結びつける最良の方法の1つは、「生成」スクリプトを作成して、特定のスタイルのボタンや図形を、必要な任意の色で自動的に生成できるようにすることです。これは、そのような非常にシンプルなスクリプトの1つです。ここでは、プレーンな形状の透明度から3Dに見えるオブジェクトを生成するために、"-shade"オプションを使用します。形状は、オン/オフの透明度のみを持ち、これは慎重に保持され、Webページで一般的に使用するための透明GIF画像として使用できるようにします。結果のグレースケール「シェード」画像は、"-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}
上記のスクリプトでは、入力画像が1回だけ読み込まれることに注意してください。これにより、「-」を入力および出力ファイル名として(おそらく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
    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
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
ソース画像の形状または透明度のみが箇条書きの生成に使用されるため、任意の形状を使用できます。Webサイトに固有の独自の形状を選択してください。また、形状を定義する透明度の有無にかかわらず、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]
次に、マスクを使用してロゴの単色を切り取り、テキストを追加して、単色のロゴを生成します。

  magick logo_mask.png -background red -alpha shape \
          -font Candice  -pointsize 36  -fill white  -stroke black \
          -gravity Center  -annotate 0 "Ant" \
          logo.png
[IM Output]

次に、オーバーレイハイライトテクニックを使用して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]
IMによって提供される新しいシャドウ生成演算子のおかげで、シャドウの追加も簡単になりました。

  magick logo_3D.png \( +clone -background navy -shadow 80x4+6+6 \) +swap \
          -background none  -layers merge +repage logo_3D_shadowed.png
[IM Output]
楽しみのために、最後に「粗い紙」のような背景にロゴをオーバーレイしてみましょう。他にも多数の背景キャンバスを作成できます。背景の例で、このような例のコレクションを参照してください。


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
[IM Output]

反射

反射は比較的簡単に行うことができますが、そうは思えないことが多いでしょう。表面の色や質感、また、そのような効果が表面反射と表面に反射している物体との距離によってどのように増加するかなどに対処する必要があります。基本的に、比較的単純なはずのことが、非常に複雑なものになることがよくあります。[IM Output]それでは、比較的単純な画像の反射から始めましょう。ここでは、ポケモンキャラクターであるアズマリル(右参照)の画像を使用します。必要に応じて、独自の画像に置き換えてください。完璧な鏡の反射を行うには、ソースオブジェクトをコピーして反転し、その背後にいくつかの背景を追加して、コンテキストを与えるだけです。たとえば...

  magick pokemon.gif \( +clone -flip \) -append \
          -size 100x100 xc:black +swap \
          -gravity North -geometry +0+5 -composite  reflect_perfect.png
[IM Output]

表面色 - 一般的な減衰

上記の点で注目すべきことは、反射が完璧であるため、実際には黒い表面での反射のように見えないことです。元の画像の「ミラータイル」のようであり、それも事実です。通常のバスルームの鏡でさえ、それに当たるすべての光を反射するわけではなく、それが得られる最高の鏡です。したがって、反射の最初のルールは次のとおりです...
反射は決して完璧ではありません。
すべての反射は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]
はるかに良い...これで、実際に反射のように見えます!反射を弱くするもう1つの方法は、反射画像を半透明または半透明にすることです。たとえば、画像のアルファ値を乗算して、ソースオブジェクトの約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]
これは実際には好まれており、表面の色を任意の色にしたり、いくつかの種類の色のテクスチャやパターンにしたりできることを意味します。たとえば、遠い地平線の表示からの無限タイリング技術を使用して、水平な木製の床を生成してみましょう。

  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]
そして今、この木製の床に、半透明の反射を伴う画像をオーバーレイします。

  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]
反射したオブジェクトがないと、木製の表面はややくすんで生命感がありませんが、いくつかのオブジェクトが反射すると、床は突然非常に磨かれた外観になります!

歪んだソース

はい。もう少し凝ったことを試してみて、画像に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]
明らかに間違っています。画像が歪んでいるように見えますが、元のユーザーに対して平らなままです。なぜなら...
表面に接触している物体もその反射に接触します。
非常に明白なことですが、これを間違えている人がいるのを見てきました。もちろん、オブジェクトが表面上に浮いている場合は、接触しません。これを修正する1つの方法は、ソース画像と、その画像の反射を別々に歪ませてから、レイヤーマージで結果を結合することです。

  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]
歪みのパラメーターの非常に異なるセットからわかるように、反射を歪ませることは非常に困難になる可能性があります。最初の歪みを少し変更すると、反射した画像の2番目の歪みに計算された変更が必要になるため、さらに困難です。反射歪みの座標を計算する方法を教えてくれる2つのルールがさらにあります。
水平面での反射は常に真下を向いています。
つまり、反射は常にユーザーの方を向いており、ユーザーは画像の真正面にいるため、水平面での反射は、ユーザーの方に直接真下に向かいます。これは物理法則であり、画像を少なくとも半現実的にしたい場合は、破りたくないものの1つです。そして最後に、覚えておくべきもう1つのルールです。
水平面に反射した垂直面は、
反射したオブジェクトと同じ高さの反射を持ちます
画像内でオブジェクトが「遠く」に見える度合いに関係なく、最終的な画像での反射の高さは、反射されるオブジェクトと同じ高さである必要があります!これは明白ではなく、非常に間違えやすいです。

これらの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]
ご覧のとおり、この方がはるかに簡単で、オブジェクトの歪みに対処するだけなので、変更もずっと簡単になります。また、そうでなければ繰り返すことが不可能な歪みを使用して、別の反射を作成することもできます。たとえば、画像から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]
次のセクションに進む前に、最後の点を述べます...影は一般に、反射と同じルールに従いますが、最後の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]
これはかなりうまく機能し、生成が非常に簡単なので、反射を生成する非常に一般的な方法です。この手法は、反射する光の大部分が完全な反射ではなく、よりグローバルな環境の反射であるという点で有効です。元の画像から遠くなるほど、元の画像が反射される割合は少なくなります。

ぼかし減衰

ソースオブジェクトの実際の反射を構成するコンポーネントは、距離が離れると単に弱くなるだけではありません。実際には、反射する表面は一般的に非常に滑らかではないため、反射は距離が離れるほどぼやけ、ファジーになり、歪みます。これはマクロな歪みではなく、非常に小さな顕微鏡レベルでの歪みです。鏡面ハイライト反射を生み出すのと同じ効果です。つまり、反射のソースに近いほど、反射は比較的シャープですが、ソースから遠ざかるほど、画像はぼやけます。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]
反射のぼかしは、垂直に引き伸ばしたぼかし楕円を使用することでさらに強化できます。たとえば、「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]
平面の反射画像としては、これ以上のものは得られないでしょう。
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)

ジグソーパズル

私が支援を求められた最も興味深いことの1つは、大きな写真から奇妙な形の「ジグソー」ピースを切り取って強調することでした。実際、「ミスタージグソー」としても知られるテオ・ファン・ホーセル氏は、多くの異なる回転で、たくさんの別々のピースを生成したいと考えていました。以下は、私たちの議論から開発された、1つのピースに関するものですが、適切なテンプレートセットを使用すれば、あらゆるパターンのピースを生成できます。
右には、ドイツ、ベルリンのホロコースト記念碑の写真の800x600画像のサムネイルがリンクされています。この写真は、2006年4月のヨーロッパ旅行中に私が撮影したものです。これは本当に難しいジグソーパズルを作るのに最適な画像のように見えます。そして、その下に、上記の画像から抽出するジグソーピースのテンプレート画像があります。これは、そのような画像セットの一部でした。ジグソーピースのフルセットには、エッジとコーナーを含む16 x 12のアレイで、192個のマスクが含まれています。この特定のジグソーピースは、100x100ピクセルのマスクで、800x600ピクセルの画像+365+96オフセットで使用するように設計されています。これらの数値は、互いに適合するさまざまなピースの大きなセットを持っている場合にのみ重要です。そうする予定がない場合は、もちろん任意のオフセットを使用できます。   [photo]
[IM Output]
私自身、そのようなジグソーセットをいくつか収集しており、それらを使用してあらゆる画像のジグソーパズルを作成できます。そして、これがテオ・ファン・ホーセル氏が実際に彼のウェブサイトで行っていることです。実際のジグソーパズルを作成する場合、オフセット情報は、元の画像からのそのピースの位置と配置を識別するため、非常に重要です。したがって、この情報を保持するように努めます。マスクのオフセットは、形状の周りの余分なパディングのために負になる場合があるため、この状況を処理するために画像コマンドをテストおよび調整する必要がある場合があることに注意してください。余分なパディング自体により、切り取ったジグソーピースのサイズやオフセットを変更せずに、簡単に回転、厚さの追加、影の効果を追加できます。
ただし、まずこのテンプレートをアウトラインに変えましょう。

    magick jigsaw_tmpl.png -edge .5 -blur 0x.5 jigsaw_edge.png
[IM Output]
次に、これを画像に重ねて、ジグソーピースを形成するために切り取られるものを大まかに把握できます。

    magick holocaust_md.jpg \
            \( jigsaw_edge.png -negate \) -geometry +365+96 \
            -compose multiply -composite \
            -crop 100x100+365+96 +repage jigsaw_outline.png
[IM Output]
通常、これはジグソーを生成するときには行われませんが、ピースの位置が重要でない場合(大きなパズルの一部ではない場合)に役立ちます。その場合は、オフセットを調整して、そのジグソーピースに適したコンテンツを選択できます。
-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]
ソース画像を、テンプレートの形状で覆われている領域に切り取ったことに注意してください。マスクの外側の領域は不要になり、早く削除することで画像処理が高速化されます。また、ビューポートトリミングの特別な使用法に注意してください。その後に「-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]
実際のジグソーでは、この面取りは、ジグソーピースを機械でプレス切断した結果です。また、ピースにわずかなへこみができるため、ピースを元に戻すと、切断の跡がまだ見えます。それでは、ピースに厚さを加えましょう。これが私が見つけた最も良く、最も速い方法ですが、あまり良い技術だとは考えていません。もっと良いものを見つけたら、教えてください。

   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
[IM Output]
そして最後に、影を追加しましょう。

    magick jigsaw_thickness.png \
            \( +clone   -background Black -shadow 50x3+4+4 \) \
            -background none -compose DstOver -flatten \
            jigsaw_shadow.png
[IM Output]
上記のすべてのコマンドは、単一のシェルスクリプトに簡単に保存でき、私は自分用にこれを行っています。スクリプト「jigsaw」は、ソース写真、テンプレート、および宛先の3つの画像パラメーターと、上記に示したさまざまな機能強化を有効にするための多数のオプションを受け取ります。ジグソー形状を使用する必要もありません。あらゆるマスクテンプレートを使用して、適切な追加効果を使用して画像のパーツを切り取ることができます。上記とスクリプトバージョンの最大の違いは、デフォルトでは、スクリプトは切り取った画像のオフセットを追跡しながら、最終画像を可能な限り小さく保つことです。このオフセット位置を保持することで、単純な「-mosaic」または「-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
[IM Output] ==> [IM Output] [IM Output]
[IM Output] ==> [IM Output] ==> [IM Output] [IM Output] ==> [IM Output]
最後の画像は、可能なジグソーサムネイルスタイルの始まりです...コーナーのジグソーピースを取り、スケーリングと拡張を使用して、マスクをフルサイズの画像テンプレートマスクに変換します。これは、既存のサムネイルからコーナーピースを切り取るだけでなく、否定されて画像の残りの部分も生成するために使用されます。これら2つの画像を重ね合わせると、かなり見栄えの良いジグソーサムネイルが生成されます。ピース作成のオプションで「-d +15+7」が使用されていることに注意してください。これにより、生成されたPNG画像の「ページオフセット」が、画像の元の位置と比較して少しだけずれ、示された結果が単純かつ簡単に生成されます。使用可能なその他のオプションについては、スクリプト自体を参照してください。
生成されたページオフセットは負になる可能性があり、オプションのソフトシャドウ効果が含まれる可能性があるため、抽出されたピースにはPNG画像のみを使用することをお勧めします。GIF画像は、負のページオフセットやシャドウ効果を処理できず、透明度が関与する場合に、滑らかに見えるアンチエイリアスエッジも生成されません。

一般に、GIF(およびJPEG)画像は、最終画像以外では使用しないでください。詳細については、一般的な画像フォーマットの例のページを参照してください。
ジグソーパズルのテンプレートに限定されず、任意の形状のマスクを任意の画像で使用できます。あなたが思いついたものを私に教えてください。ハイライト、厚さ、影の効果、およびおそらく「マスクの否定」オプションのより良いコントロールが必要なため、「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」の出力にさまざまなヒストグラム調整を行うことで、非常に幅広い可能性が生まれます。その1つに、「ジェル」効果として知られる効果があり、「Photoshop」のハウツーWebサイト(「ジェル効果チュートリアル」でGoogle検索)でよく見られます。まず、必要な形状を作成しましょう。これは、事前に作成された画像である場合も、上記で3Dの弾丸状の「ハート」で行ったように、「ディングス」フォントから抽出されたものである場合もあります。ここでは、ボタンとしてシンプルな楕円形を使用しましょう...

  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]
次に、高度に修正されたぼかしシェード操作を使用して、色のついた形状にシャープな「ジェル」ハイライトを追加しましょう...

    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]
ぼかしで丸みを帯びさせた後、透明度(マット)チャンネルのコピーに「-shade」を適用しました。このシェードでは、高さや「方位角」のない光源を使用しました。これは基本的に、ぼかしをかけた形状の片側だけにグレー色のハイライトが表示され、それ以外はすべて黒になることを意味します。次に、このハイライトのグレースケールを、「-sigmoidal-contrast」演算子を使用して調整(シャープ化)し、ハイライトされた領域のサイズ(「60%」のしきい値レベル)を縮小し、そのエッジをシャープ化しました(非常に高い「16」の指数係数を使用)。このように高い指数値を使用すると、演算子は元の画像の形状に基づいて、フラットな色領域を生成する「ファジー」な「-threshold」演算子のように動作します。このスムーズなコントラスト/しきい値関数については、シグモイド非線形コントラストを参照してください。最後に、ハイライトのレベルを「-evaluate」を使用してすべての色を目的のハイライトレベルで乗算し、「-roll」を使用して、その位置を形状領域にシフトしました。ここで、ハイライトは黒の上にグレー(黒は変更しない)であるため、与えられたグレーレベルで黒以外の領域を明るくするために、「スクリーン」アルファ合成が使用されます。残りは境界線を少し暗くすることだけです...

    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]
今回は、エッジを暗くするために垂直に照らされた「-shade」を使用し、変更せずに残したい領域を白色にしました。そのため、反転レベル調整を使用してグレースケールを調整し、アルファ抽出法で保存された透明度を復元した後、「乗算」アルファ合成を使用して、影響を受けた境界線を暗くすることができました。いくつかのテキストと影効果を加えて、楕円形の「ジェル」ボタンを完成させましょう...

    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
[IM Output]

「アクア」または「バブル」効果

「アクア」ウォーター効果を生成するために、完全な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]
画像の周りに1ピクセルの透明な境界線を追加したことに注意してください。これにより、次の処理手順が少し簡単になります。次に、この形状画像の丸みのあるシェードを生成する必要があります。

  magick aqua_shape.png \
          -alpha Extract -blur 0x8  -shade 130x30 -alpha On \
          -background gray50 -alpha background -auto-level \
          aqua_shade.png
[IM Output]
アルファ背景を処理する奇妙な行は、透明領域の非表示の色をミッドトーンのグレーにリセットして、色の正規化に影響を与えないようにするためです。これは非常に重要になる可能性があります。次に、このシェードを、水やガラスの泡によって光が歪むように見える「照明効果」に変えます。

  magick aqua_shade.png \
          -function polynomial  3.5,-5.05,2.05,0.3 \
          aqua_lighting.png
[IM Output]
多項式関数は、画像の曲線調整に使用されます。全体的な効果を与えるのはこの関数であり、決定が難しい場合があります。これを行うために、この「曲線」に必要な制御点を、IMサポートシェルスクリプトである「im_fx_curves」に渡しました。これにより、これらの制御点に適合する「曲線」に必要な多項式方程式の「係数」が返されます。

  im_fx_curves -c -p  0,30  100,80  50,50  80,50  > aqua_coeffs.txt
[Gnuplot] ==>
[Coeffs]
この照明効果の最終的な調整は、照明効果のエッジを暗くすることです。

  magick aqua_lighting.png \
          \( +clone -alpha extract  -blur 0x2 \) \
          -channel RGB -compose multiply -composite \
          aqua_light+edge.png
[IM Output]
これで、シェーディングオーバーレイが完了しました。残りは、ハードライト合成を使用して、これを元の画像に適用することだけです。

  magick aqua_shape.png aqua_light+edge.png \
          -compose Hardlight -composite   aqua_result.png
[IM Output]
結果として得られる画像の最終的な全体的な色が、実際には元の形状の元の色であることに注意してください。実際、これをマルチカラーの画像に適用しても、まったく問題ありません。そこで、初期形状画像の作成を含め、上記のすべての手順を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
[IM Output]
上記を調べると、以前に説明したすべての手順が、元の画像に合成される照明画像を生成するために適用されていることがわかります。

タイリング可能な星と彗星

さまざまな目的のために、ランダムな星雲(星の強さは可変)のタイルを作成したかったのです。これは、私がゆっくりと改善してきた試みの結果です。ランダムノイズ画像を使用して、それ自体を間引き、斑点パターンを生成します。

  magick -size 100x100 xc: +noise Random -channel R -threshold 5% \
          -negate -channel RG -separate +channel \
          -compose multiply -composite   speckles.gif
[IM Output]
このパターンは、キラキラアニメーション効果の基礎ですが、他の効果の出発点でもあります。たとえば、星を作るには、よりリアルにするために、ランダムな「斑点」パターンをもう少し変更する必要があります。

  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]
斑点マスク(「R」チャンネル)だけでなく、星の強度画像(「G」チャンネル)も2回乗算することに注意してください。これにより、ピクセル強度が2乗の減衰になり、実際の夜空と同じように、明るい星よりも暗い星が多くなります。この後、ぼかしによって、星の強度に基づいて星のサイズを拡大します。これにより、天文学者の写真プレートに星が焼き付いたような効果が生成され、さらにリアルになります。ぼかしの値が大きいほど、効果は大きくなります。最後に、「-contrast-stretch」により、結果が可視化されます。2つのランダムノイズ画像(1つはマスク用、もう1つは星の色用)を使用することで、単純なグレースケールの星ではなく、ランダムな色の星を生成できます。

  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]
ただし、これはさらに多くの作業が必要になる場合があります。色の強度を単純に線形分布に対して乗算するだけでなく、直接2乗する必要があるためです。ただし、これは機能し、さらなる開発の出発点を提供します。色はランダムである必要はなく、星の他の画像から簡単に取得できることに注意してください。たとえば、星の色自体は、最終的な背景として使用される画像からソースすることもできます。これで、星景ジェネレーターができたので、「-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]
もちろん、星の数は少なく、星の強さの「減衰」も少なくしたいと考えています。画像を極座標歪曲することで、彗星を特定の点に向かって飛んだり、螺旋状に回ったりさせることができます!

  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]

[IM Output]
ここでは、星を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]
暗い星は小さな点しか生成せず、「星の爆発」という点ではごくわずかであるのに対し、大きな明るい星は非常に大きな「星の爆発」を生成することに注意してください。これで、最も明るい星の周りにフレア「リング」を生成するために「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]
上記のテクニックは、達成できることのほんの始まりにすぎません。いくつかの簡単なアニメーションテクニックを使用すると、画像に追加できるキラキラやランダムなフレアを作成できます。この簡単な例の1つは、単純なシェルスクリプト「star_field」を使用して星の爆発を生成するGIFアニメーションの例で提供されています。この星ジェネレーターで何ができるでしょうか?チャレンジ:
  • 星ではなくキラキラを生成します。最初の斑点フィールドは、マスク(たとえば乗算)によって制限される必要があります。キラキラと星の両方を、「スクリーン」合成を使用して画像にオーバーレイできます。
  • マスクされた「斑点フィールド」を使用して、オーバーレイ用の星の爆発を生成します。完全な星の爆発ではなくシードをマスクすることで、爆発の「光線」をマスクされた領域から離れて画像の他の部分にオーバーレイできます。つまり、光線は単に「カットオフ」されるだけではありません。
  • ランダムな星の爆発のアニメーションを作成します。これには、単一の星の爆発フィールド(おそらく光線が回転する)をアニメーション化する必要がある場合があります。
  • いくつかの星の爆発アニメーションを生成することで、それらをマージして、異なる場所からの重なり合う一連の星の爆発を形成できます。
  • ヒストグラムをストレッチしてしきい値を設定することにより、画像の最も明るい部分にある単一の「シード」点を見つけます。次に、マスクされた領域にヒットするまで、単一のピクセルを選択します。
  • フラットシェーディングされた形状のエッジに星を作成します。
上記の課題のいずれかを管理した場合、または星ジェネレーターを他の目的で使用した場合は、私と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
[IM Output] ==> [IM Output] ==> [IM Output]
表示用に中間画像を保存するために「+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
[IM Output] [IM Output] [IM Output] ==> [IM Output] ==> [IM Output]
フレア画像を生成するために極座標歪曲を使用する場合の主な問題は、光線が半径とともに幅が広くなることです。実際には、光線が暗くなるとほぼ一定の幅を維持するか、少なくとも細くなるようにする必要があります。アイデアやポインターを歓迎します
色合いの色付けも、このタイプの画像では重要になる可能性があります。たとえば、ここでは、ミッドトーンの色を青色に色付けします。

  magick flare_2_final.png  -fill SkyBlue  -tint 100%  flare_2_color.png
[IM Output]
-tint」操作に使用されるパーセンテージは、光線とフレアリングの強度を調整するためにも使用できますが、画像の白いコアを大きく変更することはありません。これらの例は、IMフォーラムのディスカッションマスクに放射状フレアを使用するでさらに詳しく説明されました。