Generate pseudo-3D parallax videos from a single image
Your images stay private — everything runs in your browser
+
Click or drag & drop
JPG / PNG supported
Duration (sec)
15
Horizontal shift (px)
40
Vertical sway (px)
15
Sway cycles
4
Zoom level
1.25
Resolution (width px)
512
* Higher resolution may increase processing time on some devices
Zoom center
(50%, 50%)
Click preview to set
Generated video will appear here
Depth map will be generated after upload
A single photo carries no record of what was near the camera and what was far away. Working that out is the first thing Parallax 3D does. An AI model looks at the picture and outputs a depth value for every pixel as a shade of grey — the brighter the pixel, the closer it was.
The rest is straightforward. The frame is cut into a fine grid, and each cell is redrawn shifted by its depth multiplied by the camera movement. Near cells move a long way, distant cells barely move at all. Repeat that while sweeping the camera position, and a still photo starts to read as three-dimensional.
It is not building a real 3D model, though. Shifting a foreground subject should reveal the background hiding behind it, and that background was never photographed, so the surrounding pixels get stretched to fill the gap. That is why pushing the movement too far makes edges look like they are melting. When the effect looks wrong, horizontal shift is almost always the culprit.
There are six parameters, and they fall into two groups: the ones that change how the motion looks, and the ones that change how long generation takes. Settle the motion on a short, low-resolution render first, then raise the length and resolution at the end.
The "Depth map" tab shows the estimate in greyscale. Checking it before you generate saves you from waiting several minutes only to be disappointed.
There is only one thing to look for: whether your subject's outline separates from the background. If the boundary between a person and what is behind them blurs into the same shade, that photo will produce almost no parallax. If the subject stands out clearly in white, even a modest horizontal shift will look convincingly three-dimensional.
Certain photos reliably confuse the estimate: shots through glass, wire fences, thin branches and stray hair, and frames that are mostly blank sky. So do screenshots and flat illustrations, which have no depth to find in the first place. Those will only warp, so it is quicker to try a different image.
Generation time is the frame count multiplied by the cost of drawing one frame. The frame count is 24fps times the duration, so 15 seconds means 360 frames. The per-frame cost rises with resolution.
So 1024px at 30 seconds is roughly eight times the work of 512px at 15 seconds. While you are hunting for settings, render at around 512px and 5–8 seconds; raise the length and resolution once you like the motion.
Depth estimation runs once, right after you pick an image. The one exception is the resolution slider, which rebuilds from the original image and therefore triggers a fresh estimate. Every other slider reuses the existing depth map, so you can adjust them freely while watching the preview.
Depth estimation runs on your device, but the model itself has to be downloaded once before that can happen. It comes from Hugging Face (a quantized build of Depth Anything V2 Small, about 26MB) and jsDelivr (the WebAssembly runtime that executes it).
The only thing leaving your browser is a request for those files. Your photo is not part of it. The depth estimate, the frame rendering and the MP4 encode all happen locally.
After the first run everything is in your browser cache, so the wait effectively disappears. The one-time download is worth keeping in mind on a mobile connection.
The output is an H.264 MP4 with no audio track, ready to post straight to social media or a messaging app. The video width is whatever you set on the resolution slider; the height follows your original image's aspect ratio.
The camera motion is built so the last frame lines up with the first. Looping playback has no visible jump, which suits stories, profile videos and anything else that repeats.
Encoding uses the browser's WebCodecs API. Recent browsers support it, but on an older one pressing Generate may fail to produce a file. Updating the browser fixes that.