2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CanvasでSVGを描画する際に線の間に黒いスキマが出る現象

Last updated at Posted at 2025-07-18

SVGをCanvas上に描画した際に、線と線の間に細い黒い隙間が生じる現象が発生し、その原因がやっと判明しました。

結論から言うと、SVGのpathの幅や座標が小数(例:23.6375など)になっていたことが原因でした。

バグ再現

オンラインデモで現象を確認してみましょう。新しいタブで開くとより見やすいです:

このデモでは、JavaScriptでSVGのpathを模倣してCanvasに描画しています:

<div class="color-info">
  <strong>Current Colors:</strong>
  <span class="color-watch" id="fillWatch"></span>
  Fill: <span id="fillColor"></span>
  <span class="color-watch" id="strokeWatch"></span>
  Stroke: <span id="strokeColor"></span>
</div>

元のSVG構造はこちらです:

<svg width="146" height="2532" viewBox="0 0 146 2532" fill="none" xmlns="http://www.w3.org/2000/svg">
  <path d="M145.998 0.00012207H122.36V2968.18H145.998V0.00012207Z" fill="${stroke}"/>
  <path d="M23.6375 0H0V2968.18H23.6375V0Z" fill="${stroke}"/>
  <path d="M122.364 0.00012207H23.6396V2968.18H122.364V0.00012207Z" fill="${fill}"/>
</svg>

原因

path座標や幅が小数値であると、Canvasでピクセル単位に変換する際にズレが生じます
ブラウザのCanvasはアンチエイリアシング処理(ぼかし)を使って描画するため、ぴったり隣り合っているはずの矩形間に隙間が発生してしまうのです。

スクリーンショット 2025-07-15 17.50.10.png

今回のような直線だけで構成される場合は、座標を整数に修正することで、ある程度対応が可能です。しかし、波線や曲線などpathが複雑な場合は調整がかなり難しくなります:

スクリーンショット 2025-07-17 18.20.19.png
スクリーンショット 2025-07-17 18.20.50.png

解決策

以下のような対策が考えられます:

  • SVGのpathの幅や座標を整数に揃える(Figmaなどでも設定可能)。
  • SVGをPNG画像として書き出して使用する。
    • 特に波線など、細かい調整が難しい場合に見た目上は完璧な結果が得られます。
    • ただし、色パターンが多数ある場合は汎用性が低くなります。

同じような現象でお悩みの方の参考になれば幸いです!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?