← All Tools

Why SVG-to-PNG Conversion Always Freezes on a Static Frame

Guide · Last verified Aug 27, 2026

Ever converted a moving logo or icon SVG to PNG, only to find the entire animation gone and just the opening frame left behind? That's not a bug in the conversion tool — it's a structural limit baked into how SVG-to-PNG conversion works in the first place. This guide walks through why SVG can hold animation at all, what actually happens inside the browser when it turns SVG into PNG, and what alternatives exist if you want to keep an animated SVG moving in an image file.

1. Why SVG can be animated in the first place

Unlike raster formats such as JPG and PNG that list out pixel values, SVG (Scalable Vector Graphics) is an XML-based vector format that describes shapes using coordinates and formulas. Because elements like circles, rectangles, and paths are stored as text instructions — "draw a circle at this coordinate with this radius" — it's a natural extension to add a time axis to those instructions. SVG can change attribute values over time using SMIL-style <animate>/<animateTransform> tags, or by applying ordinary CSS @keyframes/transition rules to animate color, position, size, and opacity. In other words, a single SVG file can contain both "a static picture" and "rules for how that picture changes over time." PNG, by contrast, is just a single snapshot filling a grid of pixels with color values — there's no room for a time axis to begin with.

2. Why Canvas rendering only ever captures "that instant"

The most common way browsers convert SVG to PNG is to load the SVG file as an <img> tag or Image object, then use the <canvas> element's drawImage() method to draw that image onto the canvas and extract the pixel data. In this process, the Image object fires a "load complete" event once it has parsed the SVG document and finished its first render — and drawImage() draws exactly whatever was rendered at that moment onto the canvas. The problem is that this load-complete moment is typically the 0-second mark, when the animation timer either hasn't started yet or has only just begun. The Canvas API has no idea what animation is running inside the SVG or how far along it is; it only transfers "whatever is rendered on screen right now" into pixels. As a result, no matter how sophisticated the time-based animation in the original SVG — rotation, movement, color changes — the PNG ends up locking in a single frame of the initial, pre-animation state. This isn't a quirk of any particular conversion tool; it's the overlap of two separate facts: PNG, as a static image format, fundamentally cannot represent animation, and the Canvas rendering API only ever takes a snapshot of the current moment with no awareness of animation timing.

In short: SVG (has a time axis) → loaded as an Image object (rendering state locked in at load-complete) → drawn to Canvas via drawImage(), baking only that state into pixels → PNG (no time axis, one frozen frame). Animation information never survives past the "load complete" step — it's simply discarded.

3. If you need a moving image — GIF, APNG, or WebM

To keep an animated SVG as an actual moving image file rather than a single PNG, you need to pick a format that can store multiple frames in sequence from the start. The most widely used approach is to capture the SVG animation repeatedly at fixed time intervals and bundle those captures into a GIF. GIF stores multiple frames along with each frame's display duration, so it's universally compatible, but its limited color palette (256 colors) can cause banding on SVGs with lots of gradients. If you need higher fidelity, APNG (Animated PNG) is an alternative — it can store multiple frames while preserving PNG's true-color and transparency support. If the animation is long or smooth motion matters, screen-recording it into a WebM or MP4 video file is another option; since you're recording the SVG actually animating on screen, the motion is preserved exactly as-is. On the flip side, if all you need is a single static image (say, for an icon or thumbnail), PNG conversion is precisely the right result — in that case, converting a non-animated static SVG, or capturing a specific frame at the moment you want, is the better approach.

4. Summary — what to check before converting

Frequently Asked Questions

Q. Why doesn't an animated SVG move anymore after converting it to PNG?

A. PNG is a static image format that only stores a color value for each pixel, so it has no concept of time at all. During conversion, Canvas captures only the rendering result at that single instant as pixels, so even if the original SVG has animation, only one frame survives in the output.

Q. Why is it specifically the pre-animation state that gets captured?

A. The browser loads the SVG as an Image object, and drawImage() on the Canvas runs right when the initial decode finishes — which is usually the 0-second mark, before the animation timer has really gotten going. The Canvas API has no awareness of how far an animation has progressed; it simply draws whatever is rendered at that moment, which is why the initial state is what gets captured.

Q. How can I keep a moving SVG as an actual moving image file?

A. You need a format that can store multiple frames in sequence, not PNG. Capture the animation repeatedly at set intervals and bundle it into a GIF or APNG, or screen-record it into a WebM or MP4 video — either way the animation plays back as intended.

Q. How is animation inside an SVG actually implemented?

A. SVG is an XML-based vector format that describes shapes with coordinates and formulas, and on top of that you can layer SMIL-style <animate>/<animateTransform> tags or CSS animations/transitions to change coordinates, color, opacity, and more over time. That time-based change is exactly the kind of information a static format like PNG cannot represent.