ImageMagick の例 --
サムネイルの作成とフレーム

ImageMagick の例 序文と索引
サムネイルの保存
一般的なサムネイル作成
その他の非 IM テクニック
装飾の追加
フレームテクニック
エッジ画像を使用したフレーム
ImageMagick の最も大きな用途の1つは、家族の写真アルバム、スポーツや趣味のページ、カタログなどのサムネイルを作成することです。一般的に、World Wide Web またはフォトCDでの使用を目的としています。このページでは、サムネイルの生成に使用される例とテクニックを提供します。

サムネイルの保存

まず、非常に重要な点から始めたいと思います。ビデオカメラや写真スキャンからの元の画像は、元の形式のまま、できれば非可逆形式(JPEG画像形式ではない)で、ファイル名の変更を除き、サイズ変更やその他の変更を加えずに安全な場所に保管する必要があります。もちろん、スキャンした画像は再スキャンできますが、後で劣化したコピーからやり直すよりも、元のソースを再利用する方がはるかに優れています。これは、どのような形式の変更も画像内の情報の一部が失われることを意味し、他の用途のために画像を再加工するためのソースを提供するため、非常に重要です。元の画像は、表示用にサイズ変更または色調整される可能性のある作業画像である必要はありません。将来の使用のために画像を保存し、安全な場所にバックアップしてください。次に、サムネイルを作成する前に、通常サイズの画像形式に対してサムネイルをどのように保存するかを決定し、そのスキームを順守する必要があります。これは、Webページで特に重要です。スキームには以下が含まれます...
  • メインの写真画像を、必要なサイズで可逆JPEG形式で保存し、生成されたサムネイルには同じ名前を使用しますが、GIF画像形式を使用します。たとえば、同じファイル名ですが、形式とサフィックスが異なります。メイン画像: photo_name.jpg サムネイル: photo_name.gif
  • たとえば「thumbs」など、便利な名前のサブディレクトリに同じ名前でサムネイルを保存します。メイン画像: photo_name.jpg サムネイル: thumbs/photo_name.jpg
  • 元の画像と同じ形式を使用しますが、ファイル名に余分な文字列を追加します。一般的な文字列の追加には、「_tn」、「_small」、「_thumb」などが含まれます...メイン画像: photo_name.jpg サムネイル: photo_name_tn.jpg
  • 上記のいくつかの組み合わせ。サムネイルを異なる画像形式で保存し、追加の画像サフィックスをファイル名に追加して、サブディレクトリに保存できない理由はありません。メイン画像: images/photo_name.jpg サムネイル: thumbs/photo_name.jpg.gif これは実際にはWWWではごく一般的であり、完全に別々のマシンに保存された2つのディレクトリさえ見たことがあります!
最初のスキームでは、「-format」設定を使用して出力画像形式を指定することで、元の画像を破棄せずに「magick mogrify」を使用してすべてのサムネイルを生成できます。IM v3.2.0以降、「magick mogrify」でも、変更された画像を保存する別のディレクトリを指定する特別な「-path」設定のおかげで、2番目のスキームも可能になりました。たとえば、これは、作成されたばかりの「thumbs」サブディレクトリ内のJPG画像をGIFサムネイルに変換します。

  mkdir thumbs
  magick mogrify  -format gif -path thumbs -thumbnail 100x100 *.jpg
他の方法では、「magick mogrify」を実行する前に、元の画像のコピーを作成するか、画像を処理するための特別なスクリプトを作成するか、またはその他のDIY方式が必要です。いくつかの単純な非IMテクニックは、バッチ処理 - 「magick mogrify」を使用しないの例のセクションの最後に詳述されています。どの方法を選択する場合でも、重要なことはサムネイルストレージのスキームを選択し、それを守ることです。すべてのサムネイルに同じスキームを使用することで、シェルまたはPerlスクリプトを作成して、サムネイルの生成やHTMLリンクの生成を簡単に行うことができます。詳細は後述します。

サムネイル形式の選択

サムネイルを保存する形式は、ディスク上の最終的なサイズとWebページのダウンロード速度に大きな影響を与える可能性があります。この点に関しては、さまざまな一般的なファイル形式の概要を調べることをお勧めします。特に、以下に注意する必要があります...
JPEG は適切に圧縮され、非可逆ですが、小さなサムネイルではなく、大きな実世界の画像向けに設計されています。また、いかなる形式の透明度も許可していません。要約すると、この形式は大きな画像には適していますが、サムネイルには適していません。プロファイルに注意してください(次のセクションを参照)。JPGはサムネイルには推奨されていませんが、WWWで画像を表示する場合は、はるかに低い「-quality」パーセンテージ(たとえば50または30%)で、より小さい800x600ピクセルの画像を使用することをお勧めします。あまり良くは見えません。「-sampling-factor 2x1」を使用すると、より小さいJPEG画像サイズも生成されることが示唆されています。友人がダウンロードするために(参照されている場所で)一時的に置かれる場合を除き、元のフル画像が決して直接Webに置かれることを推奨しません。リンクしないでください(ディレクトリインデックスによる場合でも)。1日以上置くと、Googleで検索される可能性があります。
GIF は単純な小さな画像に適しており、適切に圧縮されます。色の制限は256ですが、小さな画像ではほとんど目立ちません。また、サムネイルには必要ないかもしれませんが、本当にファンシーなものを求めるのであれば、画像の漫画のようなアニメーションも実行できます。問題は、この形式がブール値(オン/オフ)の透明度しか持たないため、整形された画像にひどい境界線が生じることです。その解決策は、ブール値の透明度のみを使用するようにサムネイルを設計するか、特定の背景色でのみ使用できるように配置することです。詳細については、背景色またはパターンでのGIFの例を参照してください。
PNG は、サムネイルの現代的な理想的な形式です。優れた圧縮と内部形式スタイルを備えています。これは非可逆であり、すべての色を表示でき、最近ではほとんどすべてのブラウザで理解されています(ただし、Microsoft Internet Explorerの場合、v7より前では、WebページにJavaスクリプトを追加する必要があります)。さらに重要なことは、この形式が半透明の色を理解し、必要に応じて影やエッジをシャープかつクリアにしたり、フェードアウトやぼやけたりさせることができることです。ただし、この形式ではアニメーションは実行されませんが、関連するMNG形式では実行されます。ただし、その形式をサポートしているブラウザはほとんどありません。サムネイルの場合、最終的なサムネイル画像の「bzip」圧縮品質(「-quality」の最初の数字)を高く設定するだけでなく、深度と色数を減らすことで、最終的な画像のサイズを縮小できます。たとえば、以下は透明度を含まない小さなPNGサムネイルに推奨されます。

        -strip  -quality 95  PNG8:thumbnail.png
    
これにより、より小さな8ビットまたは256色に制限されたPNG形式が使用されます。また、最終的な画像を二次アプリケーションで再処理することもできます(非IM PNG処理を参照)。これにより、特定の画像に最適なPNG圧縮を自動的に見つけることができます。また、半透明の色を保持しながら、より小さな内部PNG形式に色を縮小するプログラムもあります。これは、IMが現在処理していないことです。 。
形式に関する最後の言葉... サムネイルにどのような形式を使用する場合でも、中間的な未完成の画像を保存する必要がある場合は、PNG(色を縮小しない)またはMIFF画像形式を使用してください。これにより、中間段階で画像に関する色情報を可能な限り多く保持できます。色を縮小したり、GIFまたはJPEG形式で保存したりするのは、絶対的な最後のステップとしてのみ行ってください。これは重要なことなので、繰り返します...
中間的な作業画像にJPEG、PNG8、またはGIFを使用しないでください!
PNGまたはMIFFを使用する方が適切です。

プロファイル、ストリッピング、およびJPEG処理

デジタルカメラ、スキャンソフトウェア、および一部のペイントプログラム(Photoshopは悪名高い)からの多くの画像は、プロファイルの形式で画像に関する追加情報を保存します。これには、JPEG、PNG、TIFF、およびIM v6.2.4-1 GIFなどの画像形式が含まれます。もちろん、IM固有の形式であるMIFFもこれを行います。(詳細については、画像プロファイルを参照してください)。これらのプロファイルは最大60Kbのサイズになる可能性があるため、ファイルサイズに大きな影響を与える可能性があり、デフォルトではIMはこのプロファイル情報を保持します。サムネイルにはこのデータは必要なく、多くの場合、メイン画像でさえ必要ありません。また、IMコマンドを使用して画像からプロファイルを削除することもできます...

  magick input.jpg  -strip output.jpg

  magick mogrify -strip  *.jpg
オプション「-profile '*' 」を使用してプロファイルを削除することもできます。ただし、画像を修正する場合、特にWeb表示またはサムネイル画像用にサイズを縮小する場合は、プロファイルを削除することをお勧めします。特に小さなサムネイル画像を生成するために、サイズ変更中にプロファイルを削除することは非常に一般的なため、「-resize」と「-strip」の両方が、この目的に合わせて新しい操作に結合されました。当然のことながら、このサイズ変更操作は「-thumbnail」と呼ばれます。例えば...

  magick -define jpeg:size=240x180 image.jpg -thumbnail 120x90 thumbs/image.gif

  magick mogrify -path thumbs -format gif -define jpeg:size=240x180 -thumbnail 120x90 '*.jpg'
IM v6.5.4-7より前は、「-thumbnail」は、ICCカラープロファイルを含む、画像からすべてのプロファイルを削除していました。このバージョン以降、カラープロファイルは保持されます。カラープロファイルが不要な場合は、「-strip」ですべてのプロファイルを削除してください。
magick mogrify」コマンドは、もちろん JPEG 画像のディレクトリ全体に対してサムネイルを生成しますが、保持しておきたいサムネイルを上書きしないように注意してください。多数の画像をループ処理する他の IM 以外の方法については、「バッチ処理 - Mogrify を使用しない」の例のセクションを参照してください。非常に大きな画像の場合、「-thumbnail」リサイズ演算子はさらに進んで、実際のリサイズ操作を行う前に、最初に画像を最終的なサムネイルサイズの 5 倍に縮小します。これにより、サムネイルの生成がさらに高速化されます。ただし、JPEG 画像のサムネイルを作成する場合、初期画像サイズを制限するさらに優れた方法を使用できます。それは、画像全体を最初にメモリに読み込まないことです。「-define jpeg:size=」設定 (上記の例で示されているように) は、非常に大きな JPEG 画像から読み込まれるデータ量を減らすための JPEG 画像ライブラリへの特別なヒントです。「JPEG ファイルの読み込み」を参照してください。
IM v6.5.6-0 より前は、このコーダー設定は「-size」設定から抽出されていました。これにより、ユーザーが画像作成に「-size」を使用したものの、JPEG の読み込みが予期しない結果になるという問題が発生しました。そのため、これは特別なコーダー設定に変更されました。

IM の古いバージョンでは、この「二重」の役割のために、JPEG 画像を読み込む前に「+size」を使用して設定をリセットする必要がある場合があります。
IM バージョン 6.2.6-2 以降、新しい 画像読み込み修飾子が追加され、読み込み直後に入力画像のサイズを変更できるようになりました。このオプションは、JPEG 画像だけでなく、任意の画像形式で動作します。ただし、JPEG 画像に対して「-define jpeg:size=」設定を使用することの代わりにはなりません。そのため、任意の入力画像形式のサイズを変更する推奨される方法は次のとおりです...

  magick -define jpeg:size=240x180 input.img'[120x90]' \
          -strip  output_thumbnail.gif
さて、実践的な IM サムネイルの例に移りましょう...

一般的なサムネイルの作成

一般的なサムネイルの生成 (特定の高さ)

大きなサンプル JPEG 画像を、高さ 90 ピクセルの GIF サムネイルに変換し、画像の縦横比を維持するために幅を自動調整します (250 ピクセルの幅制限内)。

  magick -define jpeg:size=500x180  hatching_orig.jpg  -auto-orient \
          -thumbnail 250x90   -unsharp 0x.5  thumbnail.gif
[IM Output]
上記では「-thumbnail」オプションを使用したことに注意してください。これは画像のサイズを変更するだけでなく、元の JPEG 画像に存在する可能性のあるプロファイルやコメント情報をすべて削除します。また、画像の初期縮小に「-sample」リサイズ演算子を使用するため、高速でありながら、小さなサムネイルに適した結果を生成します。また、読み込まれる画像の最小「-define jpeg:size=」を設定しました。これは JPEG ライブラリに渡され、(可能であれば) このサイズの 2 倍程度のサイズの画像が返されます。非常に大きな元の画像ではなく、コンピューターのメモリを必要以上にオーバーフローさせないようにするためです。私が使用する JPEG サイズヒントは、最終的なサムネイルの少なくとも 2 倍であるため、リサイズは引き続き適切な見た目の結果を生成します。「-auto-orient」演算子は、デジタルカメラからの画像の場合、カメラの向きに従って正しく回転されるようにします。これは私が使用している「デスクトップ」画像には必要ありませんが、上記のデジタルカメラユーザー向けに含めました。ただし、特にドキュメントの写真を撮る場合など、真上または真下から見ている写真の場合、向きが間違ってしまう可能性があることに注意してください。結果は、特定の高さを持つが、可変幅を持つサムネイルになります。私は自分の Web ページでこのサムネイルを使用し、一連の画像がすべて高さで一致し、すっきりとした外観になるようにします。上記の 250 ピクセルの幅制限は重要です。設定を解除した場合 (例: 「-thumbnail x90」を使用した場合)、IM は、Web ライン画像に示すような、非常に長くて細い画像のサムネイルを生成する際に問題が発生する可能性があります。その場合、小さなサムネイルではなく、画像の非常に長い拡大になってしまいます。IM のリサイズは最高の実装の 1 つですが (IM リサイズと他のプログラムの比較を参照)、結果が少しぼやけていると感じる人もいます (私も含めて)。そのため、「-thumbnail」リサイズ操作後に、画像をわずかにシャープにする (「-unsharp」を使用) ことで、上記の結果を改善できます。詳細については、「リサイズした画像をシャープにする -- Photoshop リサイズテクニック」を参照してください。ただし、実際にはすべて個人の好みの問題です。
magick mogrify」バージョンは、「magick」コマンド (最初の入力画像なし) と同じですが、現在のディレクトリにあるすべての JPEG 画像の自動サムネイルを生成します。画像引数は、IM 自体がディレクトリをスキャンし、コマンドラインシェルではないように引用符で囲まれています。これにより、大量の画像を含むディレクトリでの「行制限オーバーフローエラー」を防ぎます。

  magick mogrify  -format gif -define jpeg:size=500x180 -auto-orient \
                -thumbnail 250x90 -unsharp 0x.5  '*.jpg'
magick mogrify」は、同じ名前の既存の画像 (この場合は GIF 画像) を置き換えて、盲目的にサムネイルを作成することに注意してください。このコマンドを使用する際は、常に最大限の注意を払うことをお勧めします。

処理を行う前に、常にバックアップコピーを作成することを推奨します。
magick mogrify」が元のソース画像を上書きしないように、異なる形式 (「-format」を使用) を指定する代わりに、「-path」設定を使用して、別のサムネイルディレクトリを定義できます。両方の出力オプションを使用できます。
magick mogrify」は、新しい画像を異なる接尾辞 (「-format」) またはディレクトリ (「-path」) で出力できますが、これらはこのコマンドで利用できる唯一のオプションです。画像のファイル名も変更する場合 (例えば、サムネイルまたは小さいバージョンの画像を示すために「_tn」または「_sm」を追加する場合) は、「magick」を使用して、一度に 1 つずつ処理するシェルスクリプトを作成することをお勧めします。   私はこのようなスクリプトを作成して、同時に HTML インデックスも生成しました。

サムネイルをフィットするようにリサイズ

自動サムネイル生成の別の形式は、画像のアスペクト比を維持しながら、「100x100」などの固定サイズのボックスに合わせて画像を縮小することです。これはリサイズジオメトリ設定のデフォルトの意味です。
ただし、すでにそのようなボックスに収まっている画像を拡大することは好みません。そのためには、ジオメトリ文字列に「>」を追加する必要があります。

  magick -define jpeg:size=200x200 hatching_orig.jpg \
          -thumbnail '100x100>' rectangle.gif
[IM Output]
以前と同様に、画像のアスペクト比は維持されるため、サムネイルは正確に 100 ピクセルの正方形にはならない可能性が高くなります。ただし、画像の少なくとも 1 つの寸法は 100 ピクセルになります。

サムネイルのパディング

次に最も一般的な要望は、特定の色の境界線 (通常は「black」または「transparent」ですが、これらの例では「skyblue」を使用します) で画像を塗りつぶして、サムネイルを目的のサイズにすることです。例えば、400x300 ピクセルの画像を 100x100 ピクセルのボックスに合わせて縮小すると、通常 (上記の場合) 100x75 ピクセルのサイズになります。サムネイル画像を常に 100x100 ピクセルにするために、画像の上部と下部 (および念のために両側) にパディング境界線を追加したいと思います。
これを行うにはいくつかの方法があり、IM v6.3.2 以降では、拡張演算子を使用するのが最適です。

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          -background skyblue -gravity center -extent 100x100 pad_extent.gif
[IM Output]
IM バージョン 6.2.5 以降では、ビューポート切り抜きを使用して、結果を背景色に平坦化することもできます。

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          -gravity center  -crop 120x120+0+0\! \
          -background skyblue  -flatten    pad_view.gif
[IM Output]
拡張ビューポート切り抜きの使用の主な違いは、最小限の仮想キャンバスが必要か、それとも領域全体を「パディング」するかです。画像をパディングする別の方法は、サムネイルを適切なサイズ (この場合は 128x128 の組み込み画像「granite:」) の背景画像 (実際の画像、単色、またはタイルキャンバス) に重ね合わせることです。

  magick -define jpeg:size=200x200 hatching_orig.jpg -thumbnail '100x100>' \
          granite: +swap -gravity center -composite pad_compose.gif
[IM Output]
この方法は、(IM v5 など) IM の古いバージョンで使用するのに最適な方法でしょう。ただし、「-composite」操作は、上記の単一コマンドメソッドではなく、個別の「composite」コマンドで実行する必要があります。ただし、画像処理の観点から見ると、上記はすべて同じことを行っています。

サムネイルをフィットするようにカット

別の方法は、特定のサムネイルサイズに合わせて画像をパディングするのではなく、代わりに最終サイズに収まらない画像の部分を切り捨てることです。もちろん、これは元の画像の一部、特に画像の端を実際に失うことを意味しますが、結果は画像の中心部分の拡大されたサムネイルになります。これは通常 (常にではありませんが) 画像の主な主題であるため、実用的なサムネイル作成方法です。IM v6.3.8-3 以降、この操作を簡単にするための特別なリサイズオプションフラグ「^」が追加されました。このフラグを使用してリサイズし、目的のサイズを超えてオーバーフローする画像の部分を切り取るだけです。

  magick -define jpeg:size=200x200 hatching_orig.jpg  -thumbnail 100x100^ \
          -gravity center -extent 100x100  cut_to_fit.gif
[IM Output]
ご覧のとおり、画像のサムネイルははるかに大きく、より詳細になっていますが、元の画像の側面を切り捨てるという代償が伴います。このオプションの詳細については、「指定された領域を埋めるようにリサイズする」を参照してください。
IM v6.3.8-3 より前、この特別なフラグが追加される前は、同じ結果を達成するには非常に複雑な工夫が必要でした。詳細については、「指定された領域を埋めるようにリサイズする」を参照してください。

エリアフィットのサムネイルサイズ

最後の 2 つの方法では、多くの場合、画像が非常に小さくなり、多くの余分なパディングが表示されるか、画像を完全に領域を埋めるために画像の多くを切り取ることになります。ただし、異なるリサイズフラグを使用することで、この 2 つの極端な中間にあるサムネイルを取得できます。例えば、100x100 ピクセルのサムネイルには 10,000 ピクセルがあります。ここで、リサイズに、そのサイズのピクセル数に近いサイズに画像をリサイズするように依頼する (リサイズ「@」フラグを使用) と、わずかなパディングとわずかな切り取りの両方が必要になる画像が得られます。これにより、切り取りすぎることなく、結果のサムネイルのサイズを最大化します。例えば...

  magick -define jpeg:size=200x200 hatching_orig.jpg  -thumbnail 10000@ \
          -gravity center -background skyblue -extent 100x100  area_fit.gif
[IM Output]
ご覧のとおり、サムネイルにはパディングがあり、画像には多少の切り取りがありますが、結果はおそらく、指定されたサムネイルスペースに対する画像の最適な適合です。

指定された空間にフィットさせるまとめ

要約すると、特定のサイズの領域に画像をサムネイル化するための 3 つの方法の結果を以下に示します。3 つの方法すべてが、リサイズ引数/フラグに使用されているわずかな変更のみで、まったく同じコードを使用します。
[IM Output]
パディングフィット
リサイズ、フラグなし
[IM Output]
領域フィット
リサイズ、「@」フラグ
[IM Output]
フィットするようにカット
リサイズ、「^」フラグ

正方形のパディングと切り抜き

上記パディングとクロッピングの方法は、画像を収めたい領域の最終的なサイズがわかっていることを前提としています。しかし、必ずしもそうとは限りません。場合によっては、画像を単に「正方形にする」ことが必要になります。これは、「パディング」で外側に広げる(外側の正方形)か、端を「削る」(内側の正方形)ことで行います。IMディスカッションフォーラムの画像の正方形化に関する議論から、いくつかの方法が開発されました。
外側の正方形化は、画像の回転コピーを使用してより大きな背景キャンバスを作成するモザイクを使用することで実行できます。

  magick thumbnail.gif \
          \( +clone -rotate 90 +clone -mosaic +level-colors white \) \
          +swap -gravity center -composite    square_padded.gif
[IM Output]
一方、内側の正方形化は少し難しく、実現するためにはより多くの作業が必要です。この方法では、より小さなキャンバスを生成するために、高度なマスク処理を使用します。

  magick thumbnail.gif \
          \( +clone +level-colors white \
             \( +clone -rotate 90 +level-colors black \) \
             -composite -bordercolor white -border 1 -trim +repage \) \
          +swap -compose Src -gravity center -composite \
          square_cropped.gif
[IM Output]
別の方法としては、歪曲ビューポートを使用して、画像をクロップ/パディングする非演算歪曲を使用する方法があります(歪曲ビューポート中央正方形クロップを参照)。基本的には、「パーセントエスケープ」を使用して、Extentタイプの操作に必要な計算を実行します。外側の(パディング)正方形...

  magick thumbnail.gif  -virtual-pixel white -set option:distort:viewport \
     "%[fx:max(w,h)]x%[fx:max(w,h)]-%[fx:max((h-w)/2,0)]-%[fx:max((w-h)/2,0)]" \
     -filter point -distort SRT 0  +repage  square_external.gif
[IM Output]
仮想ピクセル設定は、パディングの色を指定するために使用されます。内側の(クロップされた)正方形...

  magick thumbnail.gif   -set option:distort:viewport \
     "%[fx:min(w,h)]x%[fx:min(w,h)]+%[fx:max((w-h)/2,0)]+%[fx:max((h-w)/2,0)]" \
     -filter point -distort SRT 0  +repage  square_internal.gif
[IM Output]
Fred WeinhausのTidbitsページより。これはよりシンプルなバージョンですが、画像が持つ可能性のあるメタデータ(コメント文字列やプロファイルなど)は失われます。

  magick thumbnail.gif -set option:size '%[fx:min(w,h)]x%[fx:min(w,h)]' \
          xc:none +swap -gravity center -composite square_internal_2.gif
[IM Output]
IMv7では、上記のような計算をクロップまたはエクステント引数の一部として直接実行できるようになり、画像のメタデータの損失を防ぐことができます。

手動クロッピング

私がWebページで使用するサムネイル画像を生成する通常の方法は、自動スクリプトと手動スクリプトの組み合わせです。最終的な画像の設定は次のとおりです。
  • 写真の元の、非常に大きなスキャンにはPNGまたはTIFFを使用します。または、デジタルカメラからダウンロードした元のJPEG画像を使用します。基本的には、アーカイブ用の変更されていない元のソース画像です。また、この画像のファイル名に「_orig」という文字列を含めるのが好きになりました。
  • サムネイルをクリックまたは選択した場合にWebで表示できる、より小さなJPEG画像形式。この画像は、ほとんどのWebユーザーが表示するのに適したサイズである800x800ピクセルのボックスに収まるようにリサイズされます。通常、ファイル名に中サイズの画像を示す「_md」を追加します。
  • そして最後に、固定の高さ90ピクセルで、幅が可変のGIFサムネイル。これにより、Webページの中央に配置されたサムネイルの行が適切に見え、使用しているブラウザのサイズに関係なく、ブラウザウィンドウの幅を自動的に埋めることができます。また、通常はサムネイルであることを示すために、画像のファイル名に「_tn」を含めるようにしました。
最初に、元のスキャン画像から「magick mogrify」を使用して、Web表示可能なJPEG画像(中サイズ)を生成します。これにより、画像のダウンロード時間と表示サイズが、一般的なWebユーザー(モデム経由でログインしている可能性のあるユーザー)にとって実用的なものになります。これらの画像から、「magick mogrify」を使用してサムネイルの初期セットを生成します。ただし、一般的な写真では、サムネイルの被写体が小さすぎて、表示しても効果的なサムネイルにならないことがよくあります。これを修正するために、自動生成されたサムネイルを調べ、約半数のケースで、自分で「被写体をズームイン」したサムネイルを手動で作成します。JPEG画像を読み込み、画像の主要な被写体を効果的に「ズームイン」し、画像の背景コンテキストの大部分を削除して、画像をクロップします。次に、これをスムーズ化してサムネイル化します。これは、「magick -thumbnail」を使用するか、画像を視聴およびクロップしている同じグラフィックプログラム(通常は「XV」、下記参照)で実行することが多いです。そのため、写真の中の人がほとんど見えないサムネイル(左)の代わりに、手動で被写体の周囲をクロップし、写真の主なポイント(右)を強調してからサムネイル化します。これにより、ユーザーは画像の内容をより明確に確認でき、その結果、より大きなJPEGバージョンの画像を実際にダウンロードして表示するかどうかをより適切に判断できます。
クイーンズランドカイトフライヤー、ロンとヴァル・フィールド
[IM Output]
自動的に
生成された
サムネイル
[IM Output]
手動でクロップ
およびサイズ変更
サムネイル
(元のスキャン写真の場合は、いずれかの画像をクリックしてください)
これはもちろん、より手動での作業が必要ですが、画像ごとに1回だけで済み、上記の例のようにスペースが多い画像でのみ必要になります。また、Webに掲載する画像でのみこれを行います。もちろん、「magick mogrify」は、手動で生成された可能性のある既存のサムネイルを上書きするため、手動でサムネイルを生成した後は、再度使用することはできません。「magick mogrify」コマンドは便利ですが、多くの画像を上書きするため非常に危険でもあります。すべての画像に対してグローバルに「magick mogrify」を実行する前によく考えてください。

HTMLサムネイルページ

ディレクトリ内でサムネイル画像の整理が完了したら、「thumblinks」という特別なperlスクリプトを使用します。これは、画像(JPEG写真とGIFサムネイル)を探し、HTMLリンク、さらには完全なHTML写真ページを生成します。スクリプトは、GIFサムネイルのサイズをHTMLで読み取って含め、サムネイルリンクの周りに事前準備されたヘッダーおよびフッターファイルを添付します。また、スクリプトは、ヘッダーファイルまたはフッターファイル自体に既存のリンクが見つかった場合、生成するリストからサムネイルリンクを削除します。これは複雑に聞こえるかもしれませんが、これにより、私のHTMLページ生成が非常に高速かつ柔軟になり、ディレクトリ内のすべてのサムネイル画像がそのディレクトリのインデックスページに追加され、インデックスヘッダー内の特定の画像にコメントを追加することもできます。また、ページをユーザーのウィンドウサイズに依存しないようにし、自動的に適合させます。「thumblinks」スクリプトの出力の簡単な例については、Tomb of Castle Artworksを参照してください。そのようなリンクを生成するための簡単な例と出発点については、identifyコマンドの使用例を参照してください。

FavIcon Webページリンクのサムネイル

WebサイトのトップレベルのWebページで、Webブラウザーがサイト全体に対して頻繁に探す「favion.ico」アイコン。この画像は、特別な複数解像度画像形式であり、次のように作成できます。

  magick image.png -alpha off -resize 256x256 \
          -define icon:auto-resize="256,128,96,64,48,32,16" \
          favicon.ico
image.png」は好きなもので構いませんが、正方形である必要があります。そうでない場合は、上記の最初のステップもそうする必要があります。128ピクセルや256ピクセルなどのより大きな解像度を含めることもできますが、それらを利用するブラウザーはほとんどありません。16ピクセルと32ピクセルのサイズは、このようなICOファイルでより一般的に使用されているため、これらに特に重点を置くと役立つ場合があります。また、多くのブラウザーは、ユーザーのブックマークファイルに保存するために使用するスペースを減らすために、画像を色を減らすことを忘れないでください。これにより、もう1つのポイントにたどり着きます。通常、最も小さい画像のみが使用され、さらに色の削減が行われるため、画像をできるだけ小さく、明確に定義しておくことをお勧めします。ICOファイル形式で画像を手動でサイズ変更する例を次に示します。

  magick image.png  -background white \
          \( -clone 0 -resize 16x16 -extent 16x16 \) \
          \( -clone 0 -resize 32x32 -extent 32x32 \) \
          \( -clone 0 -resize 48x48 -extent 48x48 \) \
          \( -clone 0 -resize 64x64 -extent 64x64 \) \
          -delete 0 -alpha off -colors 256 favicon.ico

前述のように、通常はWebサイトのトップレベルディレクトリにある「favion.ico」画像のみが使用されますが、次のHTMLタグをページのヘッダーに追加して、リンクサムネイル画像の場所を指定することもできます。

  <LINK REL="icon" HREF="/path/to/favicon.ico" type="image/x-icon">
  <LINK REL="shortcut" HREF="/path/to/favicon.ico" type="image/x-icon">
/path/to/favicon.ico」は、Webページのサムネイル画像をブラウザーが取得する場所への絶対または部分的なURL/URIにすることができます。「REL="shortcut"」の使用はInternet Explorer(IE9以前)に固有であり、公式にはHTML仕様の一部ではありません。「REL="shortcut icon"」を使用して2つのHTMLタグを結合することは可能ですが、タグを分離しておくことで、firefoxなどのIE以外のブラウザーで非ICO画像ファイル形式(SVGなど)を使用できます。このhtml要素が使用されていない場合、Webサイトのトップレベルディレクトリにある「favicon.ico」ファイルが代わりに使用されることに注意してください(存在する場合)。ICO画像形式は、すべての最新のブラウザーで普遍的に理解されています。Internet Explorerを除くすべてが、リンクサムネイルにJPEG、PNG、GIF画像ファイル形式も使用できます。FireFoxのように、アニメーションGIFやSVG画像ファイル形式を利用できるものもあります。ただし、これらの後者の形式では、通常、異なる解像度と色数で複数の画像を保持できないため、「favion.ico」画像にはICOファイル形式を使用することをお勧めします。

その他の非IMテクニック

手動画像処理に使用している「XV」プログラムは、「.xvpics」というサブディレクトリにサムネイル画像も生成します。このディレクトリ内の画像の形式は、プログラム独自の特別なサムネイル形式です(そのディレクトリ内のファイル名の接尾辞は無視されます)。これらのサムネイルは80x60ピクセルに制限されているため、「小さい」サイズ(「xv」をハックしてより大きなサムネイルを使用する場合を除く--下記のリンク参照)です。IMは、「xv」サムネイル形式(「NetPBM」画像形式に基づいています)を理解しているため、XVを使用してすべてのサムネイルをすばやく生成し、JPEG画像のXVサムネイルをmagickでGIF画像に変換して、さらに処理できます...
   xv -vsmap &               # generate thumbs with the "Update" button
   rm .xvpics/*.gif          # delete XV thumbs of existing "gif" thumbnails
   magick mogrify -format gif .xvpics/*.jpg
   mv .xvpics/*.gif .        # move the new "gif" thumbnails to original dir
特に大型の最新ディスプレイで、XVサムネイルのサイズが小さいことにうんざりしている場合は、XVコードをハックできます。XVでより大きなサムネイルサイズを使用できるようにする私のXV修正メモを参照してください。私は個人的に120x90ピクセルのサムネイルを使用しています。

さらなる処理 -- 飾りを追加する

上記は、サムネイルをより面白くするためのほんの始まりにすぎません。基本的なサムネイル画像を超えて、境界線、回転、さらにはスタイルをランダムに選択して、サムネイルギャラリーをさらに面白くすることができます。このようなサムネイルへの追加は、「飾り」と呼んでいます。これは、洗濯後の衣服に見られる余分な糸くずのことです。つまり、サムネイルに不要な追加を追加しますが、Webページやインデックス画像がより面白くなる可能性があります。次の多くの方法と処理は非常に複雑であり、ImageMagickのさまざまな画像処理オプションに関するより深い知識が必要となる場合があることに注意してください。

画像ラベルの追加

サムネイルの作成中に、サムネイルの上、下、またはサムネイルの上にラベルを追加することもできます。ただし、この種の画像処理については、ラベル付き画像の注釈でより詳しく説明しています。これらの例では、「-thumbnail」または「-strip」を使用することを忘れないでください。たとえば、「-resize」ではなく...

  magick thumbnail.gif \
          -background Lavender -fill navy -font Candice -pointsize 24 \
          label:Hatching   -gravity South -append \
          labeled.gif
[IM Output]
複合フォントを使用すると、非常に凝ったラベルを画像自体に重ねることができます。たとえば、ここではDenser Soft Outline Fontというテクニックを使用してサムネイルに注釈を加え、テキストの周囲を暗くすることで、常に読みやすい状態を保っています。

  magick -define jpeg:size=400x400  hatching_orig.jpg  -resize '120x200>' \
      \( +clone -sample 1x1\! -alpha transparent -sample 1000x200\! \
         -font SheerBeauty -pointsize 72 -gravity Center \
         -strokewidth 8 -stroke black  -fill black  -annotate 0,0 '%c' \
         -channel RGBA -blur 0x8 \
         -strokewidth 1 -stroke white  -fill white  -annotate 0,0 '%c' \
         -fuzz 1% -trim +repage -resize 115x \
      \) -gravity North -composite           -strip annotated.gif
[IM Output]
ここで、事前に生成された「thumbnail.gif」画像を使用したり、サムネイルリサイズオペレーターを使用して画像からプロファイルやコメントを削除したりしていないことに注意してください。代わりに、「+clone」、「+sample」、および「-alpha」を使用して、元の画像のメタデータも含む、より大きな透明な作業キャンバスを生成しました。これにより、画像の「comment」文字列を注釈「-annotate」オペレーターで使用して、画像に重ねるテキストを提供できます。テキストのオーバーレイを構成した後でのみ、情報をクリーンアップして「-strip」します。

隆起したボタン

-raise」オペレーターは、基本的に長方形の画像の端を強調表示して、隆起したボタンを形成する目的で作成されました。これは、シンプルで高速、かつ効果的なサムネイル変換です。

  magick thumbnail.gif  -raise 8   raised_button.gif
[IM Output]
同じオペレーターには、「プラス」の形式があり、それを使用して沈んだようなハイライト効果を作成できます。

  magick thumbnail.gif  +raise 8   sunken_button.gif
[IM Output]

バブルボタン

少し工夫すると、「-raise」オペレーターを使用して、滑らかな「バブル状」の隆起したボタンを作成できます。

  magick thumbnail.gif -fill gray50 -colorize 100% \
          -raise 8 -normalize -blur 0x8  bubble_overlay.png
  magick thumbnail.gif bubble_overlay.png \
          -compose hardlight -composite  bubble_button.png
[IM Output] ==> [IM Output] ==> [IM Output]
このタイプのテクニックの詳細については、ライトコンポジションメソッドを参照してください。このような効果の詳細については、下のセルフフレーミング(内部)を参照し、さらに次のレベルに進むには、下の照明効果マスクを参照してください。

境界線の追加

地味でシンプルな「-border」オペレーターを使用して、画像の周囲に複雑なフレームワークを生成できます。

  magick thumbnail.gif \
          -bordercolor black -border 3   -bordercolor white -border 2 \
          \( -background black -fill white -pointsize 24 \
             label:Hatching   -trim +repage \
             -bordercolor black -border 10 \
          \) -gravity South -append \
          -bordercolor black -border 10   -gravity South -chop 0x10 \
          border_framework.gif
[IM Output]

シンプルなフレーム

同様に、「-frame」オペレーターを使用すると、画像の周囲にフレームを簡単に追加できます。

  magick thumbnail.gif   -mattecolor peru  -frame 9x9+3+3  framed.gif
[IM Output]
このオペレーターには、さらに多くのオプションがあり、10種類以上の異なるスタイルのフレームを作成できます。可能性の例については、フレーム、3Dのような境界線の追加を参照してください。

モンタージュフレーム

montageコマンドは、上記のすべてを、そしてさらに多くのことを行うためのより簡単な方法を提供します。サムネイル(またはサムネイルのページ全体)を生成できるだけでなく、ファイル名、ディスクサイズ、寸法、またはユーザーが指定した文字列などの情報を含むラベルをサムネイルに付けることができます。
これは、「magick montage」を使用して、フレーム付きのサムネイルを生成する簡単な例です。

  magick montage -define jpeg:size=240x200  -label '%c'  hatching_orig.jpg \
          -frame 6  -geometry '120x100>'  montage_simple.gif
ラベルは、JPEG画像ファイルのコメントから取得されます。これは、かなり前にIM以外のコマンド「wrjpgcom」を使用して画像に追加されました。詳細については、非IM JPEG処理を参照してください。
[IM Output]
magick montage」だけでも、サムネイルの生成を非常に凝ったものにすることができます。

  magick montage -define jpeg:size=400x180  -label '%c' hatching_orig.jpg \
          -thumbnail '200x90>' -geometry '130x100>'  -mattecolor peru \
          -frame 6  -bordercolor skyblue  -font LokiCola  -pointsize 18 \
          montage_fancy.gif
[IM Output]
詳細については、「モンタージュ、画像の配列」を参照してください。特に、モンタージュHTMLサムネイルイメージマップの例に興味があるかもしれません。これは、サムネイルをクリックすると、同じディレクトリにある元の画像が表示される、サムネイルのHTMLインデックスページを作成します。

ソフトでぼやけたエッジ

ビネットオペレーターは、画像の周囲にぼやけたエッジを追加する簡単な手段を提供します。

  magick thumbnail.gif -alpha set \
          -background none  -vignette 0x4  vignette.png
[IM Output]
もちろん、このサムネイルは半透明の色を使用しているため、PNG形式で保存する必要があります。モルフォロジー距離メソッドは、画像の端の真の透明な「フェザリング」を提供します。

  magick thumbnail.gif -alpha set -virtual-pixel transparent -channel A \
          -morphology Distance Euclidean:1,10\! +channel feathered.png
[IM Output]
透明領域の最大距離は、特別な「10\!」距離スケーリングフラグによって制御されます。これは、IM v6.6.1-6でのみ追加されました。これにより、形状の付いた画像でも機能するという利点がありますが、距離計算でアンチエイリアスされたピクセルを正しく維持するには、より複雑な初期化が必要です。詳細については、距離を使用した形状のフェザリングを参照してください。ここでのフェザリングは純粋な線形グラデーションであり、シグモイド非線形コントラストオペレーターを使用して、さまざまな方法でより滑らかで先細りの外観を与えるようにさらに調整できます。また、アルファチャネルのみをぼかす前に、透明な仮想ピクセルを追加するのと同じ方法を使用して、ぼかしを使用した画像のフェザリングもできます。これにより、画像のより柔らかいフェザリングが生成されるだけでなく、画像の角が著しく丸められます。

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -blur 0x8  -level 50%,100% +channel  soft_edge.png
[IM Output]
追加の「-level」操作(透明度チャネルのみを調整)により、エッジは半透明だけでなく完全に透明になります。ただし、ぼかしによって生成されるシグモイドのような曲線のために、実際のエッジではゼロに向かって急激に低下します。また、角に加算的な効果があり、角が丸くなります。一方、鋭いくぼみのある形状の画像では、完全に透明なピクセルが半透明になる可能性があります。そのため、形状の場合は、元の画像に対して結果をマスクする必要がある場合があります(Dst-Inコンポジションを使用)。ただし、長方形のサムネイルの場合、結果は満足のいくものです。このタイプのフェザリングの使用例については、レイヤーサムネイルも参照してください。ぼかしたフェザーでレベル調整を行う代わりに、ぼかしたアルファチャネルを「50%」でしきい値処理して、上記のサムネイル画像に擬似的な丸い角を追加できます。

  magick thumbnail.gif -alpha set -virtual-pixel transparent -channel A \
          -blur 0x8  -threshold 50% +channel rounded_corner_blur.gif
[IM Output]
非常にシンプルですが、その結果は画像の角を丸めるための本当に良い方法ではありません。まず、角は実際には円形ではなく、「双曲線」曲線です。次に、結果は滑らかなアンチエイリアスされた曲線ではなく、しきい値処理操作のエイリアシング効果によって引き起こされる「ジャギー」を示します。ただし、この画像はGIFファイル形式で保存できます。詳細については、GIFブール透明度を参照してください。また、大きな丸い角を生成するために大きな引数を使用すると、「-blur」操作が非常に遅くなる可能性があることにも注意してください。そのため、大規模な角の丸めにはこの方法はまったく推奨されません。より珍しいぼかしエッジ効果については、アルファチャネルのみで放射状ぼかしを使用できます。

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -radial-blur 0x45 +channel  radial_blur_edge.png
[IM Output]
これは、完全に正方形の画像の場合にうまく機能します。角度付きのぼかしの量が増加すると、最終的には円形のビネットのようなエッジが生成されます。

  magick thumbnail.gif -alpha set -virtual-pixel transparent \
          -channel A -radial-blur 0x100 +channel  radial_blur_vignette.png
[IM Output]
見られる2つのステップ状のアーティファクトは、2つの画像サイズ寸法によって引き起こされます。正方形の画像の場合、「ステップ」は表示されません。最後の例に少し余分な通常のぼかしを追加すると、ステップの問題を改善することもできます。

丸みを帯びた角と整形された角

ソフトぼかしエッジ(上記参照)のしきい値処理は、GIFのブール透明度に適した丸い角を生成しますが、滑らかな「アンチエイリアス」された角は生成しません。丸い角またはその他の形状の画像を生成するための適切な方法は、実際に必要な形状のマスクを使用して各角を切り出すことです。次のLeif Åstrand <leif@sitelogic.fi>の方法では、画像マスク全体を乗算して適切な結果を生成します。

  magick thumbnail.gif \
     \( +clone  -alpha extract \
        -draw 'fill black polygon 0,0 0,15 15,0 fill white circle 15,15 15,0' \
        \( +clone -flip \) -compose Multiply -composite \
        \( +clone -flop \) -compose Multiply -composite \
     \) -alpha off -compose CopyOpacity -composite  rounded_corners.png
[IM Output]
基本的には、1つの黒い丸い角だけを含む元の画像から、白い透明マスクを抽出します。次に、これを反転およびフロップして、4つの角すべてが丸められたマスクを作成します。最後に、そのマスクが元の画像に適用されます。非常に大きな画像の場合、必要な処理の総量を減らすために、各個別の角にはるかに小さなマスクを適用する方が良い場合があります。それはより多くの個別の処理ステップですが、実際のピクセルの全体的な処理は少なくなります。たとえば、これが同じことですが、各角から単純な三角形の図形を切り取っています。これは、はるかに大きな画像で機能します。

  magick thumbnail.gif -alpha set  -compose DstOut \
      \( -size 20x15 xc:none -draw "polygon 0,0  0,14 19,0" \
         -write mpr:triangle  +delete \) \
      \( mpr:triangle             \) -gravity northwest -composite \
      \( mpr:triangle -flip       \) -gravity southwest -composite \
      \( mpr:triangle -flop       \) -gravity northeast -composite \
      \( mpr:triangle -rotate 180 \) -gravity southeast -composite \
      corner_cutoff.png
[IM Output]
透明度ではなく、他の色が必要な場合は、上記を実行してから透明度を削除することもできます。これはJPEG画像にとって重要になる可能性があります。ただし、(複雑さとメモリ使用量の点で)さらに簡単な解決策が、IMフォーラムディスカッションで見つかりました。これは、透明にするのではなく、色付きの角(この場合は「Red」)を重ね合わせます。

  magick thumbnail.gif \
    \( +clone -crop 16x16+0+0  -fill white -colorize 100% \
       -draw 'fill black circle 15,15 15,0' \
       -background Red  -alpha shape \
       \( +clone -flip \) \( +clone -flop \) \( +clone -flip \) \
     \) -flatten  rounded_corners_red.png
[IM Output]
残念ながら、この方法は、フラット化操作の「背景キャンバス」との相互作用のために、画像の角を単純に透明に「消去」するために使用することはできません。将来のレイヤー処理演算子でこれを解決できる可能性があります。
-flip」および「-flop」オペレーターが仮想キャンバスオフセットを正しく処理しないため、最後の例は、IM v6.6.6-5より前のバージョンでは失敗します。
極サイクルトリックを使用すると、任意のサイズのサムネイルに対して完璧なアンチエイリアスされた円マスクを生成できます。もちろん、最適な結果を得るために、歪んだ画像を元の画像のマスクとしてのみ使用します。

  magick thumbnail.gif -alpha set \
    \( +clone -distort DePolar 0 \
       -virtual-pixel HorizontalTile -background None -distort Polar 0 \) \
    -compose Dst_In -composite -trim +repage circle_masked.png
[IM Output]
このスタイルの画像処理については、下の丸い角を持つ境界線でさらに詳しく説明します。ここでは、角を切り取るだけでなく、適切なフレーム画像を重ね合わせます。

破れた紙のエッジ

Leif Åstrand <leif@sitelogic.fi>は、繊維質の紙(新聞など)から引き裂かれたように見えるエッジを生成するための次のIMコードを提供しました...

  magick thumbnail.gif \
          \( +clone -alpha extract -virtual-pixel black \
             -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 \) \
          -alpha off -compose Copy_Opacity -composite torn_paper.png
[IM Output]
1つの改善点は、新聞の角から引き裂いたように見せることです。

  magick thumbnail.gif -bordercolor linen -border 8x8 \
          -background Linen  -gravity SouthEast -splice 10x10+0+0 \
          \( +clone -alpha extract -virtual-pixel black \
             -spread 10 -blur 0x3 -threshold 50% -spread 1 -blur 0x.7 \) \
          -alpha off -compose Copy_Opacity -composite \
          -gravity SouthEast -chop 10x10   torn_paper_corner.png
[IM Output]
これは、「紙」色の境界線と湾曲した形状のマスクを追加することで改善できます。これにより、画像が手で大まかに引き裂かれたように見えます。「ソフトシャドウ」(次を参照)を追加すると、結果の画像が背景から「浮き上がり」、別々のピースのように見えるようになります。いつものように、提案と貢献をお待ちしております。

影の追加

-shadow」オペレーターを使用すると、任意の形状の画像の影の生成が簡単になります。たとえば、ここでは、サムネイルに半透明の色付きの影を追加します。

  magick thumbnail.gif -alpha set \
          \( +clone -background navy -shadow 60x0+4+4 \) +swap \
          -background none -mosaic   shadow_hard.gif
[IM Output]
ただし、ソフトでぼやけた影も簡単に作成できます。

  magick -page +4+4 thumbnail.gif -alpha set \
          \( +clone -background navy -shadow 60x4+4+4 \) +swap \
          -background none -mosaic     shadow_soft.png
[IM Output]
ここでは、サムネイル出力にPNG形式の画像を使用していることに再度注意してください。これは、影付きの画像には、GIFが処理できない半透明のピクセルが多数含まれているためです。(はい、私は自分自身を繰り返していますが、それは重要です)。GIFまたはJPG形式を使用する場合は、これらの形式が半透明の色を処理しないため、サムネイルを表示する予定のWebページまたはより大きなキャンバスに適した「-background」色を使用する必要があります。警告、上記は個々のサムネイルでは機能しますが、通常、複数のサムネイルを互いに重ねて表示したい場合は失敗します。その理由は、通常の画像と同じように、影が一緒に蓄積しないためです。複数のレイヤー化された画像からの影を処理する方法については、影のレイヤーを参照してください。

厚みの追加

画像または形状に厚さを追加すると、ハードシャドウの追加(上記参照)のように少し見えますが、まったく同じではなく、適切に行うには追加の作業が必要です。これは、元の画像の下に複数回複製され、オフセットを増やして(「DstOver」コンポジションを使用して)重ねられた、色の付いた画像のマスクを作成するため、実際には非常に難しいことです。これにより、画像の厚みが得られます。

  magick thumbnail.gif -alpha set \
          \( +clone -fill DarkSlateGrey -colorize 100% -repage +0+1 \) \
          \( +clone -repage +1+2 \) \
          \( +clone -repage +1+3 \) \
          \( +clone -repage +2+4 \) \
          \( +clone -repage +2+5 \) \
          \( +clone -repage +3+6 \) \
          -background none -compose DstOver -mosaic  thickness.gif
[IM Output]
お分かりいただけたでしょうか。「\( +clone ... \)」の行はそれぞれ、画像を南南東方向に1ピクセルずつ追加しています。また、(少なくとも長方形の画像では)半透明ピクセルが含まれていないため、結果にはGIF画像形式を使用できます。この手法の大きな問題点は、厚さを変数引数として指定したり、さまざまな角度で指定したりするのが難しいことです。厚さを加えるための特定のスクリプトを作成しない限り、です。また、角度のある部分の端はアンチエイリアス処理されていないため、改善の余地は多くあります。

ポラロイド風サムネイル

サムネイル画像をポラロイド写真のように見せたり、影を付けたり、テーブルの上に置かれているように少し回転させたりすることができます。

  magick thumbnail.gif \
          -bordercolor white  -border 6 \
          -bordercolor grey60 -border 1 \
          -background  none   -rotate 6 \
          -background  black  \( +clone -shadow 60x4+4+4 \) +swap \
          -background  none   -flatten \
          poloroid.png
[IM Output]
上記よりも複雑なバージョンが、IM v6.3.1-6 で「-polaroid」変換演算子として追加されました。たとえば...

  magick thumbnail.gif -bordercolor snow -background black +polaroid \
          poloroid_operator.png
[IM Output]
画像にはポラロイドフレームがあるだけでなく、写真にも適切な影の調整を伴う少しの「カール」が与えられ、結果の画像により奥行きを与えていることに注目してください。プラス(+)形式はランダムな角度を使用し、通常のマイナス(-)形式では回転角度を指定できます。この手法の背後にあるアイデアを提供してくれた Timothy Hunter に感謝します。
-caption」を追加したり、独自の影の色を設定したり、独自の回転(または回転なし)を指定したりすることもできます。

  magick -caption '%c' hatching_orig.jpg -thumbnail '120x120>' \
          -font Ravie -gravity center -bordercolor Lavender \
          -background navy  -polaroid -0     poloroid_caption.png
[IM Output]
この演算子の使用に関する詳細については、複雑なポラロイド変換を参照してください。ただし、これらの例では、適切な写真の「スタッキング」を実証するために、境界線と影の効果をより細かく制御する必要があるため、DIYの作成方法を使い続けます。さあ始めましょう...写真の複数のコピーを作成したり(または他の画像を使用したり)、ポラロイドの境界線を追加することで、ランダムに回転させて積み重ね、見栄えの良い写真の山を作成できます。

  magick thumbnail.gif \
     -bordercolor white  -border 6 \
     -bordercolor grey60 -border 1 \
     -bordercolor none  -background  none \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     \( -clone 0 -rotate `magick null: -format '%[fx:rand()*30-15]' info:` \) \
     -delete 0  -border 100x80  -gravity center \
     -crop 200x160+0+0  +repage  -flatten  -trim +repage \
     -background black \( +clone -shadow 60x4+4+4 \) +swap \
     -background none  -flatten \
     poloroid_stack.png
[IM Output]
上記の例の「 `magick ...` 」埋め込みコマンドは、-15から+15までのランダムな浮動小数点数を生成します。IMを数学計算機として使用する方法の詳細については、FX式を参照してください。代替として、ランダムな数値をシェル変数に割り当て、代わりに上記のコマンドに代入することもできます。
もちろん、スタックを作成するときに、同じ画像を繰り返すのではなく、異なる画像のセットを代用することもできます。または、すべてが十分に異なっているか、より見栄えが良いように、回転角度のセットを選択します。もしあなたが本当に優れているなら、回転した画像をオフセット(位置を少しジッタリング)して、すべてが完全に中心に積み重ねられないようにすることもできます。しかし、基本的な考え方は理解できるでしょう。一部のブラウザでの現在の問題のためにPNG形式の使用を本当に避けたい場合は、GIF画像形式を使用できます。これを行うには、いくつかの色の制限を受け入れる必要があり、画像が表示される正確な背景色を知っている必要があります。これらのページの場合は「LightSteelBlue」色です。

  magick thumbnail.gif \
          -bordercolor white  -border 6 \
          -bordercolor grey60 -border 1 \
          -background  none   -rotate -9 \
          -background  black  \( +clone -shadow 60x4+4+4 \) +swap \
          -background  LightSteelBlue  -flatten    poloroid.gif
[IM Output]
この手法(およびその他の情報)の詳細については、単色背景のGIF画像を参照してください。上記の「積み重ねられたポラロイド」手法は、Ally's TripのAllyと、Muziekvereniging Sempre CrescendoのStefan Nagtegaalによって、彼らのウェブサイトでポラロイドのようなサムネイルが広く使用されているため、寛大に提供されました。IMユーザーフォーラムでは、ユーザーgrazzmanが画像を回転するキャンバスに重ね合わせ、写真スプレッドを作成することで、さらに一歩進みました。

  magick -size 150x150 xc:none -background none \
          -fill white -stroke grey60 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate -10 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate -10 \
          -draw "rectangle 0,0 130,100" thumbnail.gif \
                -geometry +5+5 -composite -rotate +10 \
          -trim +repage -background LightSteelBlue -flatten \
          poloroid_spread.gif
[IM Output]
もちろん、このような写真スプレッドでは、ここで私がやったように同じ画像を何度も使用するのではなく、異なる写真のセットを使用する必要があります。この手法で考慮する必要があるいくつかの注意点があります。
  • フレーミングは上記にハードコードされており、サムネイル画像のサイズに依存します。実際のアプリケーションでは、フレーミングは上記のような写真スプレッドではなく、サムネイル生成段階に移動される場合があります。
  • -rotate」もキャンバスのサイズを拡大するため、「-gravity center」の位置からのオフセットを使用して配置しない限り、画像が追加される位置が変化します。
  • 最後に、背景フレームを常に回転させることは、品質の面では良い考えではありません。すでに回転している画像を回転させると、重ね合わせる前に別々の各画像に対して1回回転させるよりも、結果にピクセルレベルの歪みが追加されます。
より広い領域に写真の同様のランダムスタッキングが、Stas Bekmanの写真のために開発されましたが、異なる境界線手法を使用しました。写真や画像の何らかの順序付けられた、またはプログラムされたレイアウトを作成するためのより一般的な方法が、画像レイヤーの例、および写真のオーバーラップで示され、説明されています。

フレーミングテクニック

ここでは、IMの動作に関する非常に高度な知識を使用して、目的の結果を達成する、高度なフレーミングテクニックをいくつか見ていきます。

セルフフレーミング(外部)

セルフフレーミングは、画像自体を使用して、フレーミングの色とパターンを生成し、画像をフレーミングするために使用できる手法です。つまり、追加されたフレームは固定されておらず、フレーミングされる画像とほぼ一致するように変化します。これを行うには、2つの方法があります。元の画像を拡張して外部フレームを作成するか、実際の画像の一部を使用して内部フレームを作成します。たとえば、画像を拡大して暗くしてから、元の画像を上に重ねると、非常に見栄えの良いフレームが得られます。

  magick thumbnail.gif \
          \( -clone 0 -resize 130% +level 20%x100% \) \
          \( -clone 0 -bordercolor black -border 1x1 \) \
          -delete 0 -gravity center -composite  self_bordered.gif
[IM Output]
フレーミング画像を明るく(または暗く)するために、レベル調整を使用する代わりに、境界線を明るくまたは暗くする方法として、次のようなものを使用してフレームをカラーティントする方法があります...
-fill white -colorize 30%
画像をカラーティントしてフレームを生成する別の方法として、IMに拡大された画像の上に半透明のフレームを重ね合わせさせることもできます。ただし、これには、生成されたフレームに対応するために、サムネイルのサイズを正確にリサイズする必要があるため、事前に知っておく必要があります。

  magick thumbnail.gif \
          \( -clone 0 -resize 140x110\! \) \
          \( -clone 0 -bordercolor black -border 1x1 \
                      -mattecolor '#8884' -frame 9x9+0+9 \) \
          -delete 0 -composite  self_framed.gif
[IM Output]
上記のバリエーションでは、特別なビューポート制御と、デフォルトの仮想ピクセル、エッジ設定を使用して、ぼやけた画像のエッジを拡張して、外部フレームを生成します。

  magick thumbnail.gif \( +clone \
             -set option:distort:viewport 150x120-15-15 \
             -virtual-pixel Edge    -distort SRT 0  +repage \
             -blur 0x3 +level 20%,100% \) \
          \( -clone 0 -bordercolor white -border 1 \) \
          -delete 0 -gravity center -compose over -composite \
          self_blurred_edge.gif
[IM Output]
注意すべき点として、小さなエッジ欠陥(木や葉など)は、画像のエッジのみを使用して生成されたフレームで望ましくない結果を生み出す可能性があります。ビューポートは、そのビューポートを適切な量だけ拡大およびオフセットするために、元の画像のサイズを知る必要があります。ただし、FXエスケープ式を使用してビューポートサイズを計算できます(以下の例を参照)。別の方法として、上記の例でぼやけた仮想ピクセル、ディザを使用することもできます。これにより、色がさらに広がり、「エッジ」がそれほど強調されなくなります。ただし、拡張の前後にぼかしを追加すると、ディザを使用して布のような効果を生み出すことができます。

  magick thumbnail.gif \( +clone  -blur 0x3 \
             -set option:distort:viewport '%[fx:w+30]x%[fx:h+30]-15-15' \
             -virtual-pixel Dither  -distort SRT 0  +repage \
             -blur 0x0.8  +level 20%,100% \) \
          \( -clone 0 -bordercolor white -border 1 \) \
          -delete 0 -gravity center -compose over -composite \
          self_blurred_dither.gif
[IM Output]
最初のぼかしは平均色を変調し、2番目のぼかしはディザパターンの「ピクセル化」度または滑らかさを調整します。別の例を次に示します。今回は仮想ピクセル、ミラーソフトエッジ(黒ずみ)を使用しました。これは、この特定の画像に非常にうまく機能することがわかりました。

  magick thumbnail.gif  \( +clone \
             -set option:distort:viewport '%[fx:w+30]x%[fx:h+30]-15-15' \
             -virtual-pixel Mirror -distort SRT 0 +repage \
             -alpha set -virtual-pixel transparent \
                 -channel A -blur 0x8 +channel \
             -background Black -flatten \) \
          +swap -gravity center -compose over -composite \
          self_mirror.gif
[IM Output]
上記のすべての場合において、フレームは同じ画像から生成され、それが組み合わされて、元の画像からの色に基づいたフレームが生成されます。したがって、フレーミング境界線は固有であり、フレーム化された各サムネイル画像と一致します。Fred Weinhausは、元の画像のぼやけた拡大、またはコンテンツを定義する仮想ピクセル設定によって生成された境界線を使用して、セルフフレーミング画像を容易にするスクリプト「imageborder」を作成しました。

自己フレーム (内部)

新しい境界線を追加するために画像を拡大するのではなく、画像自体の一部を境界線に変えることができます。すでに画像自体の中にフレームを追加する手法をいくつか見てきました。隆起ボタンおよびバブルボタンの手法は、「-raise」演算子を使用してこれを行います。ここでは、元の画像の明るくぼやけたバージョンを生成します。これは、元の画像から生成されたマスクを使用して重ねられます。次に、その明るくぼやけたバージョンを画像の中心の変更されていない部分から分離するために、白いエッジが追加されます。

  magick thumbnail.gif \( +clone -blur 0x3 +level 20%,100% \) \
          \( +clone -gamma 0 -shave 10x10 \
             -bordercolor white -border 10x10 \) \
          -composite \
          \( +clone -gamma 0 -shave 10x10 \
             -bordercolor white -border 1x1 \
             -bordercolor black -border 9x9 \) \
          -compose screen -composite \
          self_blurred_border.gif
[IM Output]
フレーム演算子を使用して、以前に見られたボタン効果とは少し異なるものを実現することもできます。秘訣は、適用する前に最初に元の画像をシェーブすることです。たとえば、ここで元の画像のコピーを作成し、透明なフレームを使用してシェーブしてフレーム化し、その上に元の画像を重ねます。

  magick thumbnail.gif \( +clone -shave 10x10 \
            -alpha set -mattecolor '#AAA6' -frame 10x10+3+4 \
          \) -composite  inside_frame_trans.gif
[IM Output]
この問題は、元の画像の周りのフレームの平坦な部分を常に「明るく」または「暗く」(コントラストを下げる)することです。これを避けるために、バブルボタンの手法と同じ手法を使用できます。完璧なグレーキャンバスにフレームを生成し、それを変更して照明効果合成マスクを生成し、元の画像の色を調整します。たとえば、ここでは、フレーム化されたマスク画像で「VividLight」合成を使用して、原色をよりよく保持します。

  magick thumbnail.gif \
          \( +clone -shave 10x10 -fill gray50 -colorize 100% \
            -mattecolor gray50 -frame 10x10+3+4 \
          \) -compose VividLight -composite  inside_frame_light.gif
[IM Output]
バブルボタンと同様に、適用する前に照明マスクをぼかすこともできます。ここでは、原色を強調しない、より通常の「HardLight」合成を、ぼやけたフレーム照明マスクで使用しました。

  magick thumbnail.gif \
          \( +clone -shave 10x10 -fill gray50 -colorize 100% \
            -mattecolor gray50 -frame 10x10+3+4 -blur 0x2 \
          \) -compose HardLight -composite  inside_frame_blur.gif
[IM Output]
一部の光合成手法では、正しい照明効果を得るために、合成する前に画像をスワップする必要がある場合があります。
このタイプのエフェクトをさらに推し進め、より複雑な結果を生成するには、高度な照明効果マスクを参照してください。

シンプルなボーダーオーバーレイ

単純なフレーム手法の1つは、画像の配置に使用できる、フレームの下に配置できる、派手なフレームまたは形状の画像を作成することです。たとえば、ここでは、画像よりもわずかに大きく、派手な形状の穴を持つ単純なフレームを生成します。形状は「WebDings」フォント(文字「Y」)から抽出されましたが、写真のフレーミングに使用できる派手な形状には、多くの可能なソースがあります。

  magick -size 120x140 -gravity center -font WebDings label:Y \
          -negate -channel A -combine +channel -fill LightCoral -colorize 100% \
          -background none -fill none -stroke firebrick -strokewidth 3 label:Y \
          -flatten +gravity -chop 0x10+0+0 -shave 0x10 +repage border_heart.png
[IM Output]
既存の形状の画像にエッジを生成する他の方法については、エッジ変換を参照してください。
オプションで、影効果を使用して、フレームに少し奥行きを与えることもできます。

  magick border_heart.png  \( +clone -background black -shadow 60x3+3+3 \) \
          -background none -compose DstOver -flatten   border_overlay.png
[IM Output]
単純なオーバーレイフレームができたので、「DstOver」合成を使用して、フレームの下の真ん中に画像を下敷きできます。

  magick border_overlay.png  thumbnail.gif \
          -gravity center -compose DstOver -composite   border_overlaid.jpg
[IM Output]
これで、この紅葉の葉の画像など、画像で使用する事前に準備されたフレームのライブラリを生成できます。

    magick thumbnail.gif  autumn_leaves.png +swap \
            -gravity center -compose DstOver -composite \
            border_leaves.gif
[IM Text]  + [IM Text] ==> [IM Text]
画像の順序を入れ替え、「DstOver」を使用して2番目のメイン画像をフレームの「下」に配置したことに注意してください。これにより、元の画像ではなく、フレームが画像の最終的なサイズを決定します。ただし、これを行うと、メイン画像が持つメタデータ(同じ理由で)も失われます。サムネイルのメタデータ(著作権メッセージなどのラベルやコメントなど)を本当に保持したい場合は、フレームと同じサイズになるようにサムネイルをパディングし、次にデフォルトの「Over」合成を使用してフレームをオーバーレイするのが最善です。そうすることで、サムネイルが「宛先」画像になり、その画像のメタデータが保持されます。

バッジオーバーレイの例

ここでは、より複雑な事前準備されたオーバーレイの例を紹介します。今回は、IMフォーラムのディスカッション合成オーバーレイとマスキングから、正しくサイズ調整された画像(範囲を切り抜き方法として使用)を使用しています。

    magick thumbnail.gif  -gravity center -extent 90x90 \
            badge_overlay.png -composite     badge.png
[IM Text]  + [IM Text] ==> [IM Text]
画像自体は歪んでおらず、わずかに明るくしたり暗くしたり、円形に切り抜いたり、影を追加したりしているだけであることに注意してください。これらはすべて1つのオーバーレイ画像で行われます。これが実際のバッジや「ガラスの泡」である場合、画像も少し歪ませる必要があります(樽型歪みを使用するなど)。しかし、そのような歪みがなくてもうまく機能します。「バッジ」の例の次のステップについては、「マスクとペイントを使用したバッジ」を参照してください。これは、バッジの外側の背景に透明度を追加します。

マスク 'n' ペイントテクニック

多くの場合、画像の周りに四角い境界線をオーバーレイするだけでなく、画像の端を透明に切り抜きたい場合があります。このためには、通常、少なくとも2つの画像を使用します。1つは、既存の画像に追加したい色、影、ハイライトを含むマスクされたオーバーレイです。もう1つは、元の画像から削除したい部分を含む画像です。2つの画像は、2つの異なる方法で適用できます。まず、画像を「マスク」して不要な部分を削除し、次にフレームをオーバーレイするか、またはフレームをオーバーレイしてから、元の画像とオーバーレイされた色の不要な部分を透明にマスクすることができます。どちらの方法を使用するかは非常に重要であり、使用する画像は特定のテクニック用に設計されます。ある方法の画像を間違った順序で使用すると、正しく機能しません。たとえば、より複雑な形状の境界線を作成しますが、今回は背景の設定については心配しません。

  magick -size 120x100 xc:none -fill none -stroke black -strokewidth 3 \
          -draw 'ellipse 60,50 30,45 0,360  ellipse 60,50 55,30 0,360' \
          -strokewidth 3  -draw 'ellipse 60,50 57,47 0,360' \
          -channel RGBA  -blur 2x1    border_ellipse.png
[IM Output]
今回は意図的にこの境界線をぼかして、エッジのコンポーネントをより半透明にしました。その余分なぼかしがなくても、境界線には、エッジをより滑らかでギザギザに見えないようにする、多くの半透明のアンチエイリアシングピクセルも含まれています。画像処理を行う際には、これらの半透明のピクセルを考慮し、正しく保持および設定することが不可欠です。
さらに面白くするために、この「ぼやけた」境界線にランダムな色付けをしましょう。

  magick border_ellipse.png \
          \( -size 120x100 plasma:Tomato-FireBrick -alpha set -blur 0x1 \) \
          -compose SrcIn -composite     border_ellipse_red.png
[IM Output]
さて、境界線はありますが、境界線の外側と内側を表すものを定義する方法が必要です。基本的には、これらの2つの領域を定義するためのマスクが必要です。

  magick -size 120x100  xc:none -fill black \
          -draw 'ellipse 60,50 30,45 0,360  ellipse 60,50 55,30 0,360' \
          border_ellipse_mask.png
[IM Output]
この「マスク」画像の色の重要性ではなく、形状が重要です。なぜなら、基本的にどの部分が内側と分類され、どの部分が外側と分類されるかを定義するからです。マスクはグレースケールマスクにすることも、上記のような形状マスクにすることもできます。ただし、後者の方が一般的に役立ち、消去する部分や保持する部分の形状にすることもできます(上記のように)。この場合、画像は「マスクしてペイント」テクニックとして設計されており、最初に不要な部分を消去してから、追加の境界線の色をオーバーレイする必要があります(透明マスクも含まれています)。たとえば...

  magick thumbnail.gif -alpha set  -gravity center -extent 120x100 \
          border_ellipse_mask.png  -compose DstIn -composite \
          border_ellipse_red.png   -compose Over  -composite \
          border_mask_paint.png
[IM Output]  + [IM Output]  + [IM Output] ==> [IM Output]
2つのダフ・ポーターのアルファ合成操作が常に必要です。1つは部分を透明にするため、もう1つは追加の色をオーバーレイして境界線またはフレームをアウトライン表示するためです。2つの画像が必要なので、分けて保管する必要があります。MIFFやGIFなどの一部の形式では、両方の画像を同じファイルに保存して、保管を簡単にすることができます。もちろん、2つの画像を組み合わせて、単一のシンプルなオーバーレイフレーム画像を作成することもできますが、結果の外側の部分に固定の非透明色を使用する場合に限ります。たとえば、外側をDodgerBlue色として事前に定義します。

  magick border_ellipse_mask.png -alpha extract -negate \
          -background DodgerBlue -alpha shape \
          border_ellipse_red.png   -compose Over -composite \
          border_ellipse_overlay.png
[IM Output]
ただし、その場合は、以前に生成した二重マスク画像の真下に、単色やその他の背景画像をアンダーレイするだけです...

  magick border_double_masked.png \
          \( -size 120x100 plasma:Green-Green -blur 0x1 \) \
          +swap  -compose Over  -composite     border_background.png
[IM Output]
重要な点は、2つの画像、つまり「マスク」画像と「オーバーレイ」画像があれば、画像に境界線を追加する方法がはるかに自由になるということです。「オーバーレイ」境界線画像の異なる「ウィンドウ」を定義するために、複数の「マスク」画像を定義することもできます。単一のオーバーレイフレーム画像にハードコーディングするのではなく、オプションのハイライトと影を追加することもできます。ここで重要な注意点です。マスキング画像の端は、オーバーレイ画像の端と一致してはいけません。それらが一致すると、一致するエッジに沿った色の正しい処理が行われなかったり、その他の奇妙な「ハロー」効果が発生したりします。そのため、マスクのエッジがオーバーレイ画像の完全に不透明な領域内のどこかに収まるようにする必要があります。2つのマスキング操作では、注意と先見の明が必要です。

角が丸い境界線

上記で見たように、マスクとペイントのテクニックは、画像に色や「ふわふわ」を追加するだけでなく、最終的な画像を形作るために、部分を削除するためにも使用できます。これにより、画像に丸い角を追加する別の方法が提供されます。IMの「-draw」演算子には、画像の周りに興味深いフレームを提供するのに使用できる「roundrectangle」メソッドが付属しています。ただし、この描画メソッドの寸法を画像に合わせて調整する必要があります。IMには、画像サイズに基づいて数学的な計算を実行したり、抽出したりするメソッドがあります。長方形を配置する座標は、長方形を定義するために使用されるストローク幅の正確な「中心」です(浮動小数点値にすることもできます)。また、「ピクセル座標」(ピクセル座標と画像座標を参照)で指定されます。つまり、1,1の値は、上端と左端からの2番目のピクセルフォームを指しますが、より重要なことに、実際の上端と左端から1.5単位離れたピクセルの「中心」を指します。次に、ストローク幅(SW)を3として使用します。これにより、画像のすべての辺が3ピクセル大きくなります。つまり、長方形は、左上からSW/2 - 0.5または1.0ピクセル、右下からImageSize + SW*1.5 - 0.5または画像サイズ+ 4ピクセルに配置されます。ここでは、IM自体を使用してこれらの計算を行い、派手なFXエスケープを使用して必要な正確な描画コマンドを生成します。これは、後のコマンドで描画によって直接使用できるMagickベクターグラフィックスファイルとして保存されます。

  magick thumbnail.gif \
          -format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 15,15'\
          info: > rounded_corner.mvg
[IM Text]
別の方法(シェルまたはその他のAPI言語ラッパーを使用)で画像サイズを把握できる場合は、FX数学式を使用するのではなく、次の例に適切な描画パラメーターを直接代入できます。基本的に、上記は、このプロセス全体をサムネイルの実際のサイズから独立させます。直接ハードコーディングを含む他の方法も許容されます。
これで、オーバーレイ画像とマスク画像を生成できます。この一部として、元の画像(最初にストローク幅で拡大されます)を使用して、サイズを正しく取得するための透明なキャンバスを作成します。

  magick thumbnail.gif -border 3 -alpha transparent \
          -background none -fill white -stroke none -strokewidth 0 \
          -draw "@rounded_corner.mvg"    rounded_corner_mask.png
  magick thumbnail.gif -border 3 -alpha transparent \
          -background none -fill none -stroke black -strokewidth 3 \
          -draw "@rounded_corner.mvg"    rounded_corner_overlay.png
[IM Text] [IM Text]
これで、二重マスキングテクニックに必要なオーバーレイ境界線画像と透明度マスク画像が完成しました。マスクは、元の画像よりもストローク幅が大きい画像のマスクであり、消去形状マスク(白)は、周囲に1ピクセルのギャップがあるため、拡大された領域全体をカバーしていないことに注意してください。それでは、二重マスキングテクニックを使用して適用してみましょう...

  magick thumbnail.gif -alpha set -bordercolor none -border 3  \
          rounded_corner_mask.png -compose DstIn -composite \
          rounded_corner_overlay.png -compose Over -composite \
          rounded_border.png
[IM Output]
これで、丸い角で画像を枠で囲むことができました。以下は、少し工夫を凝らして、上記のすべてを単一のコマンドで実行する方法です。ただし、このオールインワンコマンドでも、指定されたサイズの画像に必要な生成された描画コマンドを保持する一時ファイルが生成されます。

  magick thumbnail.gif \
      -format 'roundrectangle 1,1 %[fx:w+4],%[fx:h+4] 15,15' \
      -write info:tmp.mvg \
      -alpha set -bordercolor none -border 3 \
      \( +clone -alpha transparent -background none \
         -fill white -stroke none -strokewidth 0 -draw @tmp.mvg \) \
      -compose DstIn -composite \
      \( +clone -alpha transparent -background none \
         -fill none -stroke black -strokewidth 3 -draw @tmp.mvg \
         -fill none -stroke white -strokewidth 1 -draw @tmp.mvg \) \
      -compose Over -composite               rounded_border_in_one.png
  rm -f tmp.mvg      # Cleanup of temporary file
[IM Output]
特に非常に大きな画像で、丸い角を作成するためのより良い方法は、別の角マスキング画像テクニックを使用することです。これについては、以下のファンシーな角オーバーレイで説明します。多くの点でこれは上記の方法の拡張ですが、画像の各角に個別のマスキングを使用することで、作業画像を小さく保ちます。

マスク 'n' ペイントを使用したバッジ

これは、上記のバッジオーバーレイの例で以前に使用した画像から開発された、はるかに複雑な「マスクしてペイント」の例です。2つの画像の生成は「ごまかして」行われ、IMフォーラムの合成オーバーレイとマスキングで議論されました。理想的には、2つの画像は一緒に開発されるべきでした。

  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_mask.png -compose DstIn -composite \
          badge_shading.png -compose Over -composite \
          badge_trans_bg.png
[IM Text]  + [IM Text]  + [IM Text] ==> [IM Text]
上記で、透明エッジとマスクエッジを整列させないようにする必要があると言いました。上記の例ではまさにそれを行いましたが、結果の画像のエッジは完全には正しくありません。ただし、着色が強いエッジではなく、微妙なシェーディングにすぎないため、この例では問題なく機能するようです。ただし、注意が必要です。「バッジ」の例の次のステップについては、「ペイントとマスクを使用したバッジ」を参照してください。これは、2つの合成操作の順序を逆にして、異なる画像セットを必要とします。

ペイント 'n' マスクテクニック

マスクしてからペイント」するのではなく、異なる画像セットを使用し、背景をマスキングする前に、最初に追加の色をオーバーレイすることができます。つまり、「ペイントしてからマスク」を実行できます。つまり、画像を取得し、最終的な境界線の色だけでなく、元の画像の外部の一部の部分またはすべての部分をマスクおよび着色する境界線をオーバーレイします。次に、別の「外側」または「クリッピング」マスクを使用して、結果の画像の不要な部分をすべて削除します。また、「オーバーレイ」画像と「マスキング」画像の両方が、境界線の外側のエッジとは別に内側のエッジを定義することに注意してください。その結果、1つの画像で境界線全体を完全に定義するわけではないため、少し使いにくくなる可能性があります。ただし、実装は簡単になる可能性があります。例:

  magick -size 120x90 xc:none -fill black -stroke black -strokewidth 0 \
          -draw 'ellipse 45,45 55,37 0,360' \
          -channel RGBA -negate -blur 0x3  +channel \
          \( granite: -auto-level -blur 0,0.7 \) \
          -compose ATop -composite border_paint.png

  magick -size 120x90 xc:none -fill black -stroke black -strokewidth 5 \
          -draw 'ellipse 59,45 56,40 0,360' border_mask.png

  magick thumbnail.gif -alpha set \
          border_paint.png -compose Over  -composite \
          border_mask.png  -compose DstIn -composite \
          border_paint_mask.png
[IM Output]  + [IM Output]  + [IM Output] ==> [IM Output]
オーバーレイされた色の一部が削除されていることに注意してください。これがペイントしてマスクテクニックの重要な機能であり、より単純なオーバーレイを使用して、マスクで調整できるようにします。この画像マスキング方法は、次のページカールコーナーの例のセットで、また後でファンシーなコーナーボーダーで使用されます。

ページカールの角

Fred Weinhaus 氏は、PageCurl という特別なシェルスクリプトを作成しました。これは、非常に複雑な数学(シェル内)を使用して、既存の画像にシンプルなページのめくれを追加するものです。例えば...

  pagecurl thumbnail.gif  pagecurl.png
[IM Output]
内部的には、実際にはペイント&マスクのテクニックを使用しています。つまり、最初に少し大きめの「カールオーバーレイ」を重ね、次に透明な角になるオーバーレイの少量を含む、画像の残りの部分を消去(マスク)します。ただし、多くの画像にページのめくれを適用したい場合、完全なスクリプト(上記)を使用するのはかなり遅いテクニックです。結局のところ、適切なオーバーレイとマスキング画像を実際に計算および生成するために、(IM自体を浮動小数点計算機として使用して)膨大な量の数学的処理を行っています。多くの画像にページのめくれを適用するには、オーバーレイと透明マスク画像を一度だけ生成するために、スクリプトを一度使用する方が優れています。それでは、小さな64x64ピクセルの画像用に、それら2つの画像を抽出してみましょう(この目的のためにスクリプトに追加された特別な「-i "pagecurl"」オプションを使用します)。

  magick -size 64x64 xc: miff:- | pagecurl -e 0.3 -i "pagecurl" - null:
[IM Output] [IM Output]
上記のコマンドは、表示されている「pagecurl_overlay.png」と「pagecurl_mask.png」の2つの画像ファイルを作成します。入力画像自体は、必要なのがマスキング画像であるため重要ではありません。「ページのめくれ」の結果は、特別な「null:」画像ファイル形式を使用して破棄されます。

  magick thumbnail.gif -alpha set -gravity SouthEast \
          -define compose:outside-overlay=false \
          pagecurl_overlay.png -composite \
          pagecurl_mask.png  -compose DstIn -composite \
          pagecurl_thumbnail.png
[IM Output]
もちろん、これらの画像はサムネイルや、おそらく適用したい画像と同じサイズではありませんが、それは問題ではありません。いくつかの追加オプションを使用して、期待どおりに動作するようにすることができます。具体的には、「-gravity」設定により、2つのオーバーレイ画像が右下隅に配置されます。また、特別なDefine設定compose:outside-overlay=false」は、小さい画像で覆われていない画像の領域がマスク画像によって消去されるのを防ぎます。詳細については、Outside-Overlay設定を参照してください。これを多くの画像に適用する場合は、「magick mogrify」を使用できます。これには、「-draw」を使用してMogrify Alpha Compositionを行う特別なテクニックを使用します。ただし、この構成方法は特別なdefine設定を理解しないため、すべて同じサイズの画像、オーバーレイ、およびマスクでのみ機能します。

  pagecurl -e 0.5 -i /tmp/pagecurl  {one image} null:
  magick mogrify {magick mogrify -format and -path options} -alpha set \
          -draw 'image Over 0,0 0,0 "/tmp/pagecurl_overlay.png"' \
          -draw 'image DstIn 0,0 0,0 "/tmp/pagecurl_mask.png"' \
          {all images to be pagecurled}...

装飾的な角のオーバーレイ

ここでは、「ダブルマスキング」テクニックを使用して、画像全体に1つの大きなマスクやフレームを適用するのではなく、異なる領域で画像をさまざまな方法で変更する方法を少し詳しく見ていきます。この場合、角のみをダブルマスクします。残りの境界線(一致させるため)は別に追加されます。[IM Output] 使用する角の画像は、DIYフレームセクションAnthonyのアイコンライブラリで見つけた元のソース(右側に表示)から生成しました。このセクションには他にもあるので、見てみるといいかもしれません。ネット上で何か見つけたら、興味深い角やエッジングのテクニックを集めるのが好きなので、教えてください。[IM Output] [IM Output] カラーオーバーレイとマスキング画像は、その初期画像から生成されたため、角を画像に重ねるためにペイント&マスクテクニックを使用できます。これらの画像は、実際には半透明のピクセルや色のシェーディングすら使用していないことに注意してください。そのため、この派手な境界線は、Webページ用にきれいな「GIF」サムネイルを作成するために使用できます。角マスクの使用に関する複雑な点は、元の画像の角のみをマスクすることです。このため、元の画像には、まず適切な追加の境界線の色を設定する必要があります。その後、2つの角マスクを、拡張された画像の各角に合成する必要があります。

  magick thumbnail.gif   -alpha set  -compose Copy \
          -bordercolor Black  -border 2 \
          -bordercolor Sienna -border 3 \
          -bordercolor Black  -border 1 \
          -bordercolor None   -border 2 \
          -bordercolor Black  -border 2 \
          -bordercolor Peru   -border 3 \
          -bordercolor Black  -border 1 \
          \
          -compose Over \
          \( fancy_add.gif             \) -gravity NorthWest -composite \
          \( fancy_add.gif -flip       \) -gravity SouthWest -composite \
          \( fancy_add.gif       -flop \) -gravity NorthEast -composite \
          \( fancy_add.gif -flip -flop \) -gravity SouthEast -composite \
          -compose DstOut \
          \( fancy_sub.gif             \) -gravity NorthWest -composite \
          \( fancy_sub.gif -flip       \) -gravity SouthWest -composite \
          \( fancy_sub.gif       -flop \) -gravity NorthEast -composite \
          \( fancy_sub.gif -flip -flop \) -gravity SouthEast -composite \
          fancy_border.gif
[IM Output]
追加される透明な境界線を保持するには、「-compose」設定をデフォルトの「Over」ではなく「Copy」に設定する必要があることに注意してください。設定しないと、透明度は次に加えられる境界線の色(この場合は「黒」)で塗りつぶされます。詳細については、Borderオペレーターを参照してください。
角マスクのみを使用する利点は、追加される角マスクに対して十分な大きさであれば、このテクニックを使用して任意のサイズの画像にフレームを設定できることです。つまり、利用可能なフレーム画像のサイズに制限されません。もちろん、4つの角の画像と境界線は、回転しているだけで、画像の周り全体で同じです。つまり、影または厚さの効果はすべて「内向き」です。これを修正するには、それぞれの角ごとに異なる角のピースを生成する必要があり、元の画像の周りの追加のエッジは非対称にする必要があります。基本的に、真の影の効果を生み出すために、はるかに複雑になります。より良い解決策は、角のピースから影の効果を取り除き、以前と同様に適用してから、影の効果をグローバルに追加することかもしれません。注意が必要です。

ペイント 'n' マスクを使用したバッジ

バッジオーバーレイバッジマスク&ペイントで以前に見たのと同じバッジ画像処理は、ペイントしてからマスキングすることでも実行できます。ここでは、最初にすべての色とシェードをペイントし、次に画像の最終的な透明度をマスクで取り除きます。

  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_paint.png -composite badge_shape.png -compose DstIn -composite \
          badge_paint_mask.png
[IM Text]  + [IM Text]  + [IM Text] ==> [IM Text]
これがこの特定の画像にとって不自然に見えるとしたら、それは正しいです。元の画像をシェーディングおよびハイライトする必要があるだけでなく、影の効果を含む領域を黒で塗りつぶす必要があるためです。具体的には、完全に透明になる部分(そして実際に完全に透明なピクセルのみ)は黒でペイントする必要があります。一方、影の効果がある半透明のピクセルには、部分的なシェード効果と部分的な透明度マスクの両方が含まれます。言い換えれば、影は、ペイントとマスキングの効果の分割において、本来単純なペイントとマスクのテクニックをぎこちなくします。これが、影やフレアスターを追加するなど、画像に半透明の追加を扱う場合に、ペイントとマスクのテクニックが通常使用されない理由です。画像に透明効果が含まれていなければ、ペイントプロセスはそれほどひどいものではなく、多くの場合、他のテクニックよりも簡単になる可能性があります。ペイントされたオーバーレイを、完成時にマスクで「カットオフ」できるからです。ページのめくれの例がまさにそのようなケースです。ページのめくれのオーバーレイをトリミングして、シームレスな全体を作成するためにマスクを使用します。また、ペイント画像の硬い黒の領域とシェーディング効果の間のギャップにも注意してください。このギャップは、内部マスキングの結果が、ペイント/オーバーレイの外部マスクのエッジと重ならないようにする必要があるという以前に言及した警告を反映しています。このギャップがこれほど明白になるのは、この特定のケースだけです。 「バッジ」の例の次のステップについては、2つのマスキング画像を単一のマスク/シェーディング画像にマージする、照明効果を使用したバッジを参照してください。

ライティングマスクテクニック

ガラスバブルボタン

サムネイル処理における次のレベルの複雑さは、非常に複雑な照明効果の適用です。ここでの難しい点は、画像への照明効果の適用というよりも、適切なシェーディング効果の生成です。たとえば、アクアエフェクトを使用すると、サムネイルに非常に複雑なシェーディング効果を与え、「ガラス」の泡で囲まれているように見せることができます。また、これは丸い角を持つサムネイルでより効果的です。サムネイル画像用に、純粋なグレーの色を使用して丸い角のマスクを生成してみましょう。

  magick thumbnail.gif -alpha off -fill white -colorize 100% \
     -draw 'fill black polygon 0,0 0,15 15,0 fill white circle 15,15 15,0' \
     \( +clone -flip \) -compose Multiply -composite \
     \( +clone -flop \) -compose Multiply -composite \
     -background Gray50 -alpha Shape    thumbnail_mask.png
[IM Output]
純粋なグレーの「形状マスク」を使用したいので、アクアエフェクト効果を適用して、この形状の照明オーバーレイを生成できます。

  magick thumbnail_mask.png -bordercolor None -border 1x1 \
          -alpha Extract -blur 0x10  -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 \
          thumbnail_lighting.png
[IM Output]
上記のような最終的な光/影のオーバーレイ画像を使用すると、適切なサイズのサムネイル画像に簡単に適用できます。

  magick thumbnail.gif -alpha Set thumbnail_lighting.png \
          \( -clone 0,1 -alpha Opaque -compose Hardlight -composite \) \
          -delete 0 -compose In -composite \
          glass_bubble.png
[IM Output]
これにより、このサイズのサムネイルに適切なシェーディング効果が追加されるだけでなく、同じ照明画像がサムネイルを適切な形状にマスクします。照明効果を適用するために使用されるのはカラーチャネルのみであり、アルファチャネルはこのプロセスでは使用されないことに注意することが重要です。同様に、マスキングする場合、使用されるのはアルファチャネルのみで、カラーチャネルではありません。異なる効果のためにチャネルをこのように分離しないと、正しい結果は得られません。画像から照明効果を抽出する方法については、IMユーザーフォーラムのトピック2つの画像から光レイヤーを抽出するを参照してください。
ただし、照明マスクに影の効果を直接追加することもできるため、これはさらに進めることができます。ただし、追加する色は純粋な黒でなければならず、選択した照明効果の構成によって、照明マスクが黒の場合に画像が完全に黒になるようにする必要があります。ただし、これは実際には影の効果が通常画像に追加される方法であるため、「照明効果マスク」に影を直接追加するだけで問題ありません。同じことは照明「フレア」の追加にも当てはまりますが、フレアオーバーレイには白いピクセルのみを使用します。本質的に、「照明効果画像」は、再び2つのマスク&ペイント画像を単一の画像にマージできます。次の例で見るように。

照明効果を使用したバッジ

マスク&ペイントを使用したバッジテクニックの画像を使用して、純粋なグレーのキャンバス画像に適用して、「マスクされた照明効果」画像をすばやく生成しました。実際には、別のスタイルのマスキング(ペイント&マスクを使用したバッジ)も同様に簡単に使用できたはずです。次に、目的の結果を再現するサムネイルに単一のマスキング画像を適用します。

  # merge "mask 'n' paint" images with a gray image,
  # to create a "lighting mask"
  magick -size 90x90 xc:gray50 -alpha set \
          badge_mask.png -compose DstIn -composite \
          badge_shading.png -compose Over -composite \
          badge_lighting.png

  # Apply the single "lighting mask"
  magick thumbnail.gif -alpha set -gravity center -extent 90x90 \
          badge_lighting.png \
          \( -clone 0,1 -alpha Opaque -compose Hardlight -composite \) \
          -delete 0 -compose In -composite \
          badge_final.png
[IM Text]  + [IM Text] ==> [IM Text]
実際、マスク画像自体が目的の画像とほとんど同じに見え、色が欠けているだけなので、この形式のマスキングはかなり好きです。つまり、完璧なグレーの画像に効果を適用するだけで、「照明マスク」画像が得られます。この特定のテクニックでは、半透明の影が正しく機能するために純粋な黒でなければならないことを忘れないでください。少なくとも元の画像の一部を含まないピクセルにグレー色を使用することはできません。すべての透明および半透明の領域は、適切なレベルのアルファ透明度を持つ、純粋な白または黒である必要があります。なぜ1つの画像だけで機能するのですか?以前は2つの画像が必要でした!答えは、マスキング画像は、純粋な黒または白の色合いのみを追加することに制限されているということです。これにより、シェーディング(照明)効果とそのマスクが、本質的に「照明効果マスク」の色成分にマージされます。その結果、アルファチャネルは、最終画像の以前に分離されていた透明マスクを保持するために解放されます。ただし、この制限は、白と黒の色合いのみを画像に追加できるということです。たとえば、マスクされる画像にグレー色を追加することはできません。ただし、色空間の原色と二次色の色合いをある程度追加することは可能ですが、制限された方法でのみであり、使用されたのを見たことはありません。まとめると、画像に特定の色や派手な境界線を追加することはできず、シェードと影、ハイライトとフレア、またはシンプルな黒または白のテキストのみを追加できます。ただし、追加された白と黒の効果を混合または重複させようとしないでください。2つの間の結果として生じるグレーのアンチエイリアシングピクセルは、下にある画像からシェードされた色を生成し、期待されるグレーの色ではありません。つまり、このテクニックの欠点です!

歪みのあるマスキング画像...

さらに驚くべきことに、陰影の色はグレースケール画像であるため、照明効果を1つのカラーチャンネルとアルファチャンネルマスクに圧縮することができます。これにより、他の画像処理効果のために2つのカラー画像チャンネルを解放できます!つまり、単一の「マスキング画像」に他のものを格納できるのです。具体的には、同じマスク画像に歪み効果を追加できます!詳細については、まさにこれを行う統合歪み画像を参照してください!一種の究極のマスキング画像です。

エッジ画像を使用したフレーミング

[IM画像] 画像に複雑な境界線を追加する一般的な方法の1つは、事前に用意されたフレーミング画像を使用して、右に示す例のようなフレームを作成することです。ただし、フレームの生成には注意が必要です。与えられた例を注意深く見ると、それが完全には正しくないことに気づくでしょう。生成されたフレームの陰影は実際には正しくありません。一般的な左上からの光源に対して正しく陰影を付けたフレームを作成するには、左と下のフレームエッジを入れ替える必要があります。したがって、始める前に、サムネイルや写真をフレーミングする際には、各エッジに正しい画像、または正しく修正された画像を使用することの重要性を強調しておきたいと思います。間違えるのは非常に簡単なので、正しくできたと思ったら、結果を再確認してください。

フレームエッジ画像

画像をフレーミングするために使用できる画像には多くの種類があります。たとえば、これはマイケル・スレート<slatem_AT_posters2prints.com>が提供した画像から修正した「金色の縁取りのある薄い黒」フレームです。
[IM Image] [IM Image]
2つの照明効果を提供するために2つの画像があり、1つは上と左のエッジ用、もう1つは下と右のエッジ用です。ただし、画像の長さに沿って色は変化しません。したがって、このフレームをタイル状に並べるか、ストレッチして必要な長さを作成できます。同様のフレーミングピースのセットは、この「薄い装飾的な金」のタイル状にできる境界線画像です。
[IM Image] [IM Image]
これらの画像には細かいディテールが含まれているため、画像を目的の長さに単純にストレッチすることはできません。また、これらのピースを長方形回転して他のエッジピースを作成することもできません。そうすると、細かいディテールの陰影が間違ってしまうからです。斜め転置歪みを使用すると、他のエッジに対して正しい陰影が得られるはずです。画像の両側で全体的な陰影と細かいディテールの陰影が正しいことを確認するために、結果を確認する際には特に注意が必要です。最後に、フレーミング画像は、この「竹」のタイル状フレーム画像のように、すべてのフレーミングエッジを生成するために使用できる単一の画像で構成されている場合があります。
[IM Image]
1つの画像だけで済む理由は、フレームに特定の「内側」または「外側」がないためです。ただし、フレームには全体的な照明効果と細かいディテールの照明効果の両方があり、他のエッジの画像に対して画像を回転/反転/転置する方法に注意する必要があります。このフレームのより大きな問題は、単純にタイル状に並べると、マクロディテールが非常に規則的になることです。そのため、より自然な外観にするために、タイルオフセットをランダム化したり、追加するピースの長さをランダム化する必要がある場合があります。これについては後ほど詳しく説明します。ご覧のとおり、フレーミング画像にはさまざまなスタイルがあり、選択したエッジング画像を(照明画像に関して)正しい方法で処理し、他の不足しているエッジング画像を生成する際には注意が必要です。

フレーミングピースの延長

これらのフレーミング画像のいずれを使用する場合でも、画像の寸法全体をカバーする長いピースを作成する必要があります。これを行う方法は基本的に2つしかありません。リサイズ(アスペクト比を維持しない)を使用してフレーム画像を単純にストレッチして、適切な長さを取得できます。これは、内部ディテールがない上記に示す最初のピースのセットには機能しますが、提示された他のフレーミング画像には適切ではありません。基本的には、内部ディテールが歪み、最終的な画像の見た目の妨げになる可能性があります。ただし、他の延長方法であるタイルは、上記のすべての画像の場合と同様に、反復パターンまたはディテールを持つフレーミング画像に使用できます。独自のフレーミングピースを作成する場合は、タイルが適切に一致し、ピクセル境界に一致するように注意して、フレーム画像の均一な色とディテールの適切な周期を確保してください。そうしないと、タイルの繰り返しが原因で、タイル間に人工的な継ぎ目ができてしまいます。現実の世界では、額縁職人も長いピースを作るためにピースを結合する際に同じ問題を抱えています。基本的には、2つの異なる色の木材や、非常に異なる木目模様を入手するのが非常に簡単で、それらを「鳩尾」で合わせると、継ぎ目が非常に目立つようになります。ですから、この問題に悩まされているのはあなただけではありません。「竹」のフレーミング画像はタイル状にする必要があります。ただし、ディテールが画像の狭い領域に限定されているため、いくつかの興味深いランダムなタイル効果を得ることができ、それを取り除くにはピースの長さのランダム化や短縮が必要になる場合があります。ただし、これについては詳しく説明しません。これについては各自で試してみてください。例として、また、ほぼすべてのフレーミング画像で機能するため、必要な長いエッジ長さを生成するために、単純な一定タイル法を使用します。

過度に単純な追加

上記の単純な「竹」フレームは、適切な長さにタイル状に並べ、画像を結合することで、簡単に延長できます。タイル化は、読み込まれている画像をタイル化するための特別なタイルキャンバス画像ジェネレーター「tile:」によって簡単に行われます。

  magick thumbnail.gif \
          \( -size 90x14  tile:bamboo.gif -transpose \) \
          \( -size 90x14  tile:bamboo.gif -transpose \) -swap 0,1 +append \
          \( -size 148x14 tile:bamboo.gif \) \
          \( -size 148x14 tile:bamboo.gif \) -swap 0,1 -append \
          frame_append.gif
[IM Output]
上記の2つの例で使用されているサイズは、フレーミング画像の既知の幅(10ピクセル)とフレーミングされている画像のサイズ(120x100ピクセル)に基づいて計算されていることに注意してください。画像に合わせてリサイズ引数を適切に調整する必要があります。フレーミングピース(竹など)をタイル化する場合の問題の1つは、すべてのエッジが互いの正確なコピーのように見えることです!つまり、フレーミングが人工的に見えるということです。現実の世界では、フレームは実際の木材の長いピースや、この場合は竹から、ほぼランダムなオフセットでカットされています。これを修正するには、画像の各エッジにわずかに異なるタイルオフセットを与える必要もあります。

  magick thumbnail.gif \
          \( -size 90x14  -tile-offset +50+0 tile:bamboo.gif -transpose \) \
          \( -size 90x14  -tile-offset +0+0  tile:bamboo.gif -transpose \) \
          -swap 0,1 +append \
          \( -size 148x14 -tile-offset +70+0 tile:bamboo.gif \) \
          \( -size 148x14 -tile-offset +25+0 tile:bamboo.gif \) \
          -swap 0,1 -append       frame_tile_offset.gif
[IM Output]
このフレーミング方法は、この特定のエッジ画像にはそれほど悪くありませんが、他のタイプのフレームでは非常に見苦しくなる可能性があります。基本的に、コーナーが正しくなく、ほとんどのフレームでは、実際には実際の額縁にあるように、エッジ画像が45度の角度で接合している必要があります。この1つの解決策は、適切なコーナー画像を事前に手動で生成し、それをこの画像に重ねて正しくすることです。これは、単純なストレッチ可能なフレーミング画像(「黒い細い」フレーミング画像など)にはうまく機能しますが、コーナー画像がタイル画像に適切に適合しない可能性があるため、「竹」のようなタイル可能な画像にはうまく機能しません。より良い方法は、タイル状のエッジ画像から直接コーナー接合部を生成することです。これを行う方法については後で説明します。

拡張されたオーバーレイフレーム

また、元の画像の境界を超えてフレームを拡張することで、このタイプのエッジフレーミングをさらに見栄えよくすることができます。これは、「我が家」タイプの写真でよく見られます。これを行うには、まず、より長いフレームピースが重ねられるように、追加のスペースをたくさん使用して元の画像を拡大する必要があります。

  magick thumbnail.gif -alpha set -bordercolor none -border 34 \
          \( -size 144x14 -tile-offset +30+0 tile:bamboo.gif -transpose \) \
          -geometry +20+10 -composite \
          \( -size 144x14 -tile-offset +45+0 tile:bamboo.gif -transpose \) \
          -geometry +154+0 -composite \
          \( -size 178x14 -tile-offset +60+0 tile:bamboo.gif \) \
          -geometry +0+20 -composite \
          \( -size 178x14 -tile-offset +0+0  tile:bamboo.gif \) \
          -geometry +10+124 -composite \
          frame_overlaid.gif
[IM Output]
このタイプのフレーミングの測定と位置は簡単ではなく、上記の例にハードコードしたように、いくつかのランダム化を使用できます。また、フレームの端を丸め、適切に陰影を付けることで、さらに見た目を改善できます。この方法で画像をフレーミングするはるかに良い方法は、フレーミング画像を完全なユニットとして生成し、固定サイズの画像に重ねるだけです(単純な境界線オーバーレイを参照)。ただし、これを行うと、各フレーミングピースの長さと位置をわずかにランダム化できなくなります。

45度の角の接合部

より良い解決策は、フレームの各コーナーに実際に45度の接合部を作成するように、サムネイルの周りにフレーミング画像を追加することです。これは簡単ではなく、フレーム、3Dのような境界線と呼ばれる魔法のような演算子を再発見するまで、多くの描画およびマスキング方法を試しました。
したがって、解決策は簡単でした。画像と「-frame」を読み込み、フレーミングする領域のテンプレートを作成します。

  magick thumbnail.gif -alpha set -bordercolor none \
          -compose Dst_Out -frame 15x15+15  frame_template.gif
[IM Output]
ここで、このテンプレートにはいくつかの興味深い機能があることに注意してください。まず、メイン画像が表示される中央が透明になっています。次に、フレーミング画像を配置する4つの異なる色で定義された領域が4つだけあります。コーナーにさまざまな色の「アンチエイリアス」ピクセルは生成しません。簡単に言えば、これらの領域の幅(15ピクセル)は、画像に追加するフレーミングピースの幅です。垂直エッジが水平エッジと異なる厚さの場合、この手法はあまりうまく機能しません。実際、そのような状況ではうまく機能する方法はほとんどありません。この画像はフレーミングテンプレートであり、カラー塗りつぶしプリミティブを使用して、4つの異なる色の領域に各フレーミングピースをタイル状に並べることで、45度のコーナー接合部を非常に簡単かつ簡単に行うことができます。
たとえば...

  magick frame_template.gif \
          -tile blackthin_top.gif -draw 'color 1,0 floodfill' \
          frame_top_filled.gif
[IM Output]
他の3つのエッジでもこのプロセスを繰り返すことができます。内部ディテールのハイライトとシャドウが正しく維持されるように転置を使用します。

  magick frame_template.gif \
          -tile blackthin_top.gif   -draw 'color 1,0 floodfill' \
          -tile-offset +0+105 -tile blackthin_btm.gif \
                                       -draw 'color 15,105 floodfill' \
          -transpose \
          -tile blackthin_top.gif      -draw 'color 1,0 floodfill' \
          -tile-offset +0+135 -tile blackthin_btm.gif \
                                       -draw 'color 15,135 floodfill' \
          -transpose \
          -gravity center thumbnail.gif -composite frame_filled.gif
[IM Output]
IMフォーラムのディスカッション45度のフレーム接合部から、下端を事前に回転させるというより単純な解決策が見つかりました。中間画像を保存するために、インメモリレジスタを使用した完全な例を次に示します。

  magick thumbnail.gif                -write mpr:image    +delete \
          goldthin_top.png             -write mpr:edge_top +delete \
          goldthin_btm.png -rotate 180 -write mpr:edge_btm +delete \
          \
          mpr:image -alpha set -bordercolor none \
          -compose Dst -frame 25x25+25  -compose over \
          \
          -tile mpr:edge_btm \
          -transverse -draw 'color 1,0 floodfill' \
          -transpose  -draw 'color 1,0 floodfill' \
          -tile mpr:edge_top \
          -transverse -draw 'color 1,0 floodfill' \
          -transpose  -draw 'color 1,0 floodfill' \
          \
          mpr:image -gravity center -composite    frame_gold.png
[IM Output]
ご覧のとおり、まだ問題があります。タイル化の結果として生じる対角線ミラー効果により、左上と右下のコーナーで非常に人工的に見えます。これを修正するには、このミラー効果を削除するために、ランダム化された「-tile-offset」を追加する必要があります。
タイルオフセット設定は、IMバージョン6.3.9-9より前のバージョンでは、XオフセットがXとYの両方のオフセット値に使用されていたため(指定されたY値は無視されました)、破損していました。つまり、上記例では、IMの古いリリースでは下と右のエッジが誤ってタイル化される可能性があります。
スクリプトバージョンこれを最後の例をテンプレートとして使用して書き直す必要がありますもちろん、上記すべてを単一のコマンドで実行できます。ただし、スクリプト化された方法で実行してみましょう。このバージョンでは、単純な歪みと、タイル状の画像の全体的な外観を向上させるためのランダム化された画像ロールを使用して、提供されたベース画像から適切なエッジ画像を生成するインラインコードを使用します。これらは、提供されたエッジフレーミング画像のタイプに応じて調整できます。処理されたエッジ画像は、インメモリタイル画像技術を使用してタイル化され、上記のように生成されたフレームテンプレートを使用してそれらの画像をマスクします。

  image=thumbnail.gif
     image_w=`magick $image -format %w info:`
     image_h=`magick $image -format %h info:`

  top=goldthin_top.png
  btm=goldthin_btm.png

     width=`magick $top -format %h info:`
     length=`magick $top -format %w info:`

  # Size of the new image ( using BASH integer maths)
  new_size=$(($image_w+$width*2))x$(($image_h+$width*2))

  # IM options to read a 'randomly rolled' version for the edge pieces
  lft="( $top -roll +$(($RANDOM % $length))+0  -transpose )"
  rht="( $btm -roll +$(($RANDOM % $length))+0  -transpose )"

  # IM options to 'randomly rolled' the top and bottom pieces
  top="( $top -roll +$(($RANDOM % $length))+0 )"
  btm="( $btm -roll +$(($RANDOM % $length))+0 )"

  # Frame the image in a single IM command....
  magick -page +$width+$width  $image  +page -alpha set \
    \( +clone -compose Dst -bordercolor none -frame ${width}x$width+$width \
       -fill none -draw "matte 0,0 replace" \
          -flip   -draw "matte 0,0 replace"   -flip \) \
    \( $top $btm -append -background none -splice 0x${image_h}+0+$width \
       -write mpr:horz +delete -size $new_size tile:mpr:horz +size \
       -clone 1  -compose DstOut -composite \) \
    \( $lft $rht +append -background none -splice ${image_w}x0+$width+0 \
       -write mpr:vert +delete -size $new_size tile:mpr:vert +size \
       -clone 1  -compose DstIn -composite \) \
    -delete 1  -compose Over  -mosaic   framed_script.png
[IM Output]
これで、ランダム化されたタイルオフセットを使用して、45度のコーナー接合部を備えた完全にフレーム化された画像ができました。はい、複雑な例です。しかし、これは、フレーム画像の事前処理をすべて1つのコマンドで行うことができるように、インメモリタイル画像を使用できるようにするためです。これにより、より複雑になりますが、より汎用性も高まります。上記のコードはシェルスクリプトに組み込まれており、ダウンロードできます(IMサンプルスクリプトディレクトリから「frame_edges.tar.gz」)。このtarファイルには、スクリプトと、スクリプトが処理および使用する方法を理解している一連のフレーミング画像が含まれています。また、フレームと画像の間に追加の「段ボール」境界線を追加します。

今後の例

マッチする角のピースと組み合わせて、タイリングエッジを使用します。エッジの画像は、事前に準備された角のピースと一致する必要があるだけでなく、画像の固定長全体にきれいにタイル状に並ぶ必要があります。つまり、エッジタイルを角のピースに合わせるために、タイル状のエッジ全体を多少伸縮させる必要がある場合があります。適切に機能させるためには、エッジタイルは画像の最小エッジ全体に少なくとも3〜4回繰り返される必要があります。このタイプのタイル状エッジ/コーナーの例としては、「葉」や「フルール」効果の境界線の実装があります。