SVGのフォント、外部画像、filterが書き出しで失敗する理由

Jack

デザインツールでは正しく見えるSVGでも、PNGに変換した途端に結果が変わることがあります。文字が別のフォントになる、画像の一部が空白になる、影が切れる、ぼかしが消える、maskが効かない、といった問題です。

原因は、SVGが必ずしも1つの完全な画像ファイルではないからです。フォント、外部画像、CSS、filter、mask、clipPathなど、外部リソースやレンダリング機能に依存している場合があります。変換環境がそれらを利用できないと、PNGの出力はプレビューと一致しません。

よくある問題を順番に見ていきます。

SVG表示問題概要
SVG表示問題概要

> 問題1:フォントが変わる、または表示されない

SVG内のテキストは、次のようにフォント名だけを指定していることがあります。

<text font-family="Inter" font-size="32">Export</text>

このコードにはInterフォントそのものは含まれていません。変換環境にそのフォントがなければ、別のフォントに置き換わります。その結果、文字幅、行間、太さが変わり、位置ずれや切れが起こります。

修正方法

ロゴや見出しはアウトライン化する。 Figma、Illustrator、Sketch、Inkscapeなどで文字をパスに変換しておくと、フォント環境に依存しません。

編集性が必要な場合だけテキストを残す。 後から文言を変える必要があるSVGではテキストを残しても構いませんが、フォントを確実に読み込める環境が必要です。

ユーザーのPCにあるフォントを前提にしない。 自分の環境で表示できるフォントでも、変換ツールや他の端末では使えないことがあります。

最終的にPNGだけが必要なら、文字のアウトライン化が最も安定します。

> 問題2:外部画像が表示されない

SVGは外部画像を参照できます。

<image href="photo.png" width="400" height="300" />

またはリモートURLを参照することもあります。

<image href="https://example.com/photo.png" />

変換ツールがその画像にアクセスできなければ、PNGではその部分が空白になります。

よくある原因:

  • SVGだけを移動し、画像ファイルを一緒に移動していない
  • 相対パスが変わった
  • リモートサーバーがCORSでブロックしている
  • 画像URLにログインが必要
  • 一時URLが期限切れになった
  • 画像ファイルが削除された

修正方法

重要な画像はSVG内に埋め込む方法が安定します。

<image href="data:image/png;base64,..." />

ファイルサイズは大きくなりますが、SVGだけで完結するため、変換時に画像が欠けにくくなります。

リンクのまま使う場合は、フォルダ構造を保ち、最終環境でSVGを開いて確認してください。

> 問題3:filterの見た目が変わる

SVGのfilterは、影、ぼかし、発光、色変換などを作れます。ただし、すべてのレンダラーが同じように処理するわけではありません。

よくある症状:

  • ドロップシャドウが端で切れる
  • ぼかしの強さが違う
  • 色が変わる
  • 複雑なfilterが消える
  • 書き出しに時間がかかる、または失敗する

影が切れる場合、filter領域が小さすぎることがあります。

<filter id="shadow" x="0" y="0" width="100%" height="100%">

影がこの領域の外に出ると切り取られます。次のように広げます。

<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">

本番用のPNGにするなら、複雑なfilterはできるだけ簡略化しましょう。単純な影やぼかしは比較的安定しますが、複数の合成や変位を使うfilterは差が出やすいです。

> 問題4:maskやclipPathが効かない

アバター、バッジ、図解、イラストでは、maskclipPathがよく使われます。これらが失敗すると、画像が切り抜かれなかったり、違う位置で切られたり、要素が消えたりします。

確認ポイント:

  • 複数のSVGを合成してidが重複していないか
  • maskclipPathが存在しないIDを参照していないか
  • mask内で外部画像を使っていないか
  • transformで要素が表示範囲外に移動していないか
  • viewBoxが適切か

ブラウザでSVGを直接開いても壊れているなら、SVG構造自体の問題です。ブラウザでは正常で、特定の変換ツールだけ失敗する場合は、デザインツール側で効果をフラット化するのが現実的です。

> 問題5:外部CSSが読み込まれない

SVGが外部CSSに依存している場合もあります。

<link rel="stylesheet" href="styles.css" />

または、外部で定義されたクラスだけを参照していることもあります。

<path class="brand-primary" />

CSSがSVG内に含まれていなければ、変換時に色、線幅、フォント、透明度が分からなくなる可能性があります。

変換用には、重要なスタイルをインラインにする方が安定します。

<path fill="#0f766e" stroke="#0f172a" stroke-width="2" />

コードとしては少し冗長ですが、PNG変換では予測しやすくなります。

> 書き出し前のチェックリスト

重要なSVGをPNGに変換する前に、次を確認してください。

  • ロゴや見出しの文字をアウトライン化したか
  • 重要な画像を埋め込んだか
  • リモートフォントや外部CSSへの依存を減らしたか
  • 色、線幅、透明度をSVG内に持たせたか
  • 影やぼかしのfilter領域を広げたか
  • maskやclipPathのIDが重複していないか
  • viewBoxが正しいか
  • 一括変換前に代表ファイルでテストしたか

svg2img.ccでは、変換はブラウザ内で行われます。ファイルがサーバーにアップロードされないためプライバシー面では扱いやすい一方、ブラウザがアクセスできない外部リソースはレンダリングできません。自分自身で完結しているSVGほど、PNG変換は安定します。

> フラット化すべき場面

最終的にPNGだけが必要なら、フラット化は有効です。文字をパスにし、画像を埋め込み、複雑な効果を簡略化し、同じサイズのアートボードから書き出します。

編集性を優先するならSVGの構造を残す。出力の安定性を優先するなら外部依存を減らす。この切り替えを意識すると、変換後のトラブルはかなり減らせます。