コンテンツにスキップ
quickthumb
すべてのドキュメント

パス

Canvas.path()は、標準SVGパスデータ(d)から塗りや線のあるベクターパスを描きます。外部SVGファイルや追加の依存関係は不要です。

from quickthumb import Canvas

canvas = Canvas(160, 120).path(
    "M 0 0 H 100 V 100 H 0 Z M 25 25 H 75 V 75 H 25 Z",
    position=(20, 10),
    width=120,
    height=100,
    view_box=(0, 0, 100, 100),
    color="#42CEB7",
)
canvas.export("path.png")

パラメーター

パラメーター 型 既定値 説明
d str 必須 SVGパス命令(M、L、H、V、C、S、Q、T、A、Z)です。
position tuple 必須 ピクセルか百分率文字列("50%")による(x, y)位置です。
width int 必須 枠の幅(ピクセル)です。
height int 必須 枠の高さ(ピクセル)です。
view_box tuple \| None None ローカル座標の範囲(x, y, width, height)。既定は(0, 0, width, height)です。
color str \| None "#000000" 単色の塗り。線だけならNoneにします。
fill LinearGradient \| RadialGradient \| None None グラデーションの塗り。指定時はcolorを置き換えます。
stroke str \| None None 線の色(16進文字列)です。
stroke_width int \| float 1 ローカル単位での線の太さです。
line_cap str "butt" 端の形。"butt"、"round"、"square"です。
line_join str "miter" 角のつなぎ方。"miter"、"bevel"、"round"です。
miter_limit float 4 ベベルに切り替えるまでの最大マイター比率です。
dash_array tuple \| None None 破線の長さの組(dash, gap, ...)です。
dash_offset float 0 破線パターンの開始位相です。
rotation float 0.0 回転角(度)です。
opacity float 1.0 0.0から1.0の不透明度です。
anchor tuple (0.5, 0.5) 回転と拡大縮小の正規化された中心です。
animation AnimationSpec \| None None 移動、トリム、破線位相、モーフィングのタイムラインです。

例

破線で曲線を描く

canvas.path(
    "M10 50 C30 0 70 100 90 50",
    position=(20, 10),
    width=120,
    height=100,
    color=None,
    stroke="#42CEB7",
    stroke_width=6,
    line_cap="round",
    view_box=(0, 0, 100, 100),
    dash_array=(12, 6),
    dash_offset=3,
)

穴のあるグラデーション

パスは偶奇規則で塗ります。内側の輪郭が重なる部分は、自然に切り抜きや穴になります。

from quickthumb import LinearGradient

canvas.path(
    "M10 10 H90 V90 H10 Z M30 30 H70 V70 H30 Z",
    position=(20, 10),
    width=120,
    height=100,
    color=None,
    fill=LinearGradient(angle=45, stops=[("#42CEB7", 0), ("#315D8E", 1)]),
    view_box=(0, 0, 100, 100),
)

パスのアニメーション

破線の位相を動かす

DashOffsetTrackを動かすと、破線が進む効果を作れます。

from quickthumb import AnimationSpec, DashOffsetTrack, KeyframeSpec, TimingSpec

phase_animation = AnimationSpec.timeline(
    DashOffsetTrack(keyframes=[
        KeyframeSpec(time=0, value=0),
        KeyframeSpec(time=1, value=20),
    ]),
    timing=TimingSpec(duration=1),
    easing="linear",
)

canvas.path(
    "M0 10 H100",
    position=(10, 10),
    width=200,
    height=20,
    color=None,
    stroke="#42CEB7",
    dash_array=(6, 4),
    animation=phase_animation,
)

線を徐々に描く

TrimEndTrackで線や輪郭を始点から終点へ徐々に描けます。

from quickthumb import AnimationSpec, KeyframeSpec, TimingSpec, TrimEndTrack

draw_outline = AnimationSpec.timeline(
    TrimEndTrack(keyframes=[
        KeyframeSpec(time=0, value=0.0),
        KeyframeSpec(time=1.5, value=1.0),
    ]),
    timing=TimingSpec(duration=1.5),
    easing="ease_in_out",
)

canvas.path(
    "M0 20 Q50 -10 100 20",
    position=(20, 20),
    width=200,
    height=60,
    view_box=(0, -10, 100, 30),
    color=None,
    stroke="#42CEB7",
    stroke_width=4,
    animation=draw_outline,
)
  • TrimStartTrackとTrimEndTrackは、全パス長に対する正規化された端点(0.0–1.0)です。
  • TrimOffsetTrackは、トリムされた区間をパスに沿って移動します。

パスのモーフィング

PathMorphTrackで、あるベクター図形から別の図形へ滑らかに変形できます。

from quickthumb import AnimationSpec, KeyframeSpec, PathMorphTrack, TimingSpec

morph = AnimationSpec.timeline(
    PathMorphTrack(keyframes=[
        KeyframeSpec(time=0, value="M10 10 H50 V50 H10 Z"),
        KeyframeSpec(time=1, value="M20 20 H60 V60 H20 Z"),
    ]),
    timing=TimingSpec(duration=1),
    easing="ease_in_out",
)

canvas.path(
    "M10 10 H50 V50 H10 Z",
    position=(10, 10),
    width=100,
    height=100,
    color="#42CEB7",
    animation=morph,
)

各キーには、退化していない輪郭が1–16個必要です。輪郭の数、順序、開閉、巻き方向、入れ子構造を一致させてください。変形の途中も含め、輪郭同士が交差したり接触したりしてはいけません。互換性のないキーはpath_morph_topologyになります。途中の図形が無効なら、位相を変更して続けず描画中に失敗します。

複雑な輪郭では、輪郭あたり256個の細分化頂点、4096個の対応点、100万回の辺の組み合わせ検査という制限を超える場合があります。再サンプリングでは頂点をローカルSVG単位の¼以内に保つ必要があり、拡大すると近似が見えることがあります。準備で拒否されたらパスを単純化してください。

出力対応

  • ラスター・動画(PNG、GIF、MP4、WebM):パス、破線、トリム、モーフィングを描画します。
  • Lottie:対応するパスモーフィングをベクターで出力します。
  • HTML:対応する開いたパスをネイティブSVGとCSSの線アニメーションで表現します。モーフィングは作成時の静止画です。
  • PDF・PPTX:対応するパスはベクターで、モーフィングは作成時の静止画として出力します。