お絵描きソフトInkscape(インクスケープ)の使い方を初級レベルから上級レベルまで広く紹介しています。
情報追加のリクエストや分かりにくい点があれば下のCONTACTフォームからどうぞ。

Inkscapeでオブジェクトを拡縮するとフィルタはどうなる?

 このページでは、Inkscapeでフィルタの適用対象のオブジェクトを拡大縮小したときのフィルタ結果への影響について考えてみたいと思います。

(2024.05.31更新)

 というのも、オブジェクトの大きさによってそのオブジェクトにフィルタを適用したときの見た目の効果に違いが出るということを経験的に知っていて、ネット上でもフィルタに関する話題の中でそういう動作をすることが語られているのを見かけることがあるのですが、じゃあもう少し詳しく理解するといったいどういう動作をしているのかについては分かっていないのです。

 具体的に言うと、つぎのような動作です。

 2つの矩形オブジェクトを描いて「拡散光」(Diffuse Light)というフィルタを適用したものです。フィルタのパラメータはデフォルトのままにしてあります。

 「拡散光」はオブジェクトの端が斜めに削られたように見える効果を出すフィルタですが、同じパラメータでフィルタを適用しているのに、全く結果が違っているのが分かります。

 実はこの左側の矩形は小さいサイズで描いた矩形で「拡散光」を適用したあとで拡大したもの、右側の矩形はその拡大後のサイズと同じサイズで描いた矩形に「拡散光」を適用した直後のものです。

 なぜこんなことになるのか?

 ポイントは2つあると思います。

ポイント1:フィルタはピクセルに対する処理なので、サイズが違う(当然ピクセル数も違う)オブジェクトでは結果も違ってくる。

ポイント2:各フィルタのデフォルトのパラメータはそこそこの大きさのオブジェクト(画像データ)に適用したときに十分なフィルタ効果が得られるように設定されているらしい。

ポイント3:フィルタを適用したオブジェクトを拡大縮小したとき、オブジェクトデータの高さと幅の値が変更されず、「transform」属性の追加で拡大縮小したように見せている。

 ポイント1は、そもそもベクタデータ(SVG形式)の編集ツールであるInkscapeの中でも異色な特徴だと思います。ベクタデータなのでオブジェクトを拡大縮小しても画面をズームアップしても画像が荒くなったりしないというのが利点としてよく挙げられますが、フィルタに限ってはビットマップ画像に対する処理であって、ベクタデータから生成されたビットマップ画像に対して最終的なステップとして実行される処理なので、そんな結果になるのでしょう。

 ちなみにオブジェクト自身のサイズはフィルタ結果に影響しますが、キャンバスのズーム操作の場合は(おそらくですが)ズームの拡大率に無関係に100%表示時の画像に対してフィルタ処理を行ってからズーム処理を実行しているせいか、フィルタ結果に影響しないようです。

 ポイント3は、Inkscapeの独自仕様なのかもしれません。フィルタを適用していないオブジェクトを拡大縮小するともちろんそのオブジェクトの「width」や「height」が変更されますが、フィルタを適用してあるオブジェクトを拡大縮小すると「width」や「height」は元の値を維持したまま「transform」という属性が自動的に追加されてそれに従って自動的に拡大縮小されるようになっています。

 フィルタ結果もオブジェクトに合わせて一緒に拡大縮小させるための工夫なのだと思います。

 そしてこの「transform」属性、フィルタを除去した直後は残っていますが、フィルタを除去したのちにオブジェクトを拡大縮小すると(実は移動だけでも)消えます。代わりに高さと幅が変更されます。

 そういうややこしい動きをする上に見た目ではどちらの状態にあるのか分からないので、フィルタを適用したり除去したり、違うフィルタに切り替えたり、フィルタの適用とオブジェクトの拡大縮小を交互に行ったりするような編集をすると、その度にフィルタの効果が変化してしまうので混乱しやすくなっています。

 例えば次のようなことが起こります。「」というフィルタで試してみます。

1.矩形オブジェクトに「霜」を適用する。

2.矩形を小さくする。「霜」の効果も一緒に縮小される。

3.「霜」フィルタを除去する。

4.もう一度「霜」フィルタを適用する。依然として「霜」の効果は縮小されている。

5.「霜」フィルタを除去する。

6.矩形を少しだけ移動してから、もう一度「霜」フィルタを適用する。今度は「transform」属性が除去されているので、縮小されていない(模様が荒くてあまり霜っぽく見えない)フィルタ効果になる。

 「transform」属性が付いている状態なのかそうでないのかは見た目に分からないので、フィルタを適用するたびに結果が違ってしまうように見えます。

 ・・・というわけで、フィルタを適用するときは、あらかじめそのオブジェクトをキャンバスに対して大き目に(どのぐらいかは分かりませんが)拡大してからフィルタを適用し、フィルタの効果が期待通りになっていることを確認した上でオブジェクトを元の大きさに縮小する、という手順を踏めば分かりやすくフィルタを適用できるということになりそうです。