<stereo-img> is a web component to display stereographic pictures on web pages, with VR support.
It supports various stereo picture formats: VR Photos (VR180, Google Camera panorama, Photosphere), left-right, and anaglyph.
See the demo for an example of the component in action.
See stereo-viewer.com for a real-world stereo viewer web app using this component.
Load the module:
<script type="module" src="https://stereo-img.steren.fr/stereo-img.js"></script>Then use the <stereo-img> custom element anywhere in your page or app, reference a stereo picture in the src attribute:
<stereo-img src="picture.vr.jpg"></stereo-img>Alternatively, you can serve the module from your own server, install it via npm:
npm install stereo-imgsrc: (Required) source of the stereo picture (absolute or relative)src-right: (Optional) source of the right eye picture (absolute or relative) for thepairtype. If used, the source for the left eye picture is read from thesrcattribute.type: (Optional) type of stereo picture:- If unset, type is inferred from heuristics
vr: VR Photo - VR180, Google Camera panorama, Cardboard Camera, Photosphere images (Where right eye image and angle of view info are embedded in the image metadata)left-right: left eye on the left, right eye on the right, Exif angle of view is used if present.right-left: left eye on the right, right eye on the left, Exif angle of view is used if present.top-bottom: left eye on the top, right eye on the bottom, Exif angle of view is used if present.bottom-top: left eye on the bottom, right eye on the top, Exif angle of view is used if present.pair: separate files for left and right image. Left eye image read fromsrcattribute, right eye image read from attributesrc-right. Adding thesrc-rightattribute will enable thepairtype without the need to use thetypeattribute.anaglyph: Anaglyph 3D - currently only supporting red / greendepth: Picture with depth map (e.g. portrait mode on Google Camera)mono: A regular, non-stereo picture. The same image is displayed on both eyes.
angle: (Optional) hint at angle of view forleft-right,top-bottom, orpairtypes- If unset, Exif angle of view is used if present.
DEGREE: any degree number between 0 and 360180: Half sphere (VR180)360: Full sphere
projection: (Optional) hint at projection (most VR pictures use equirectangular projection)- If unset, projection is inferred from heuristics.
equirectangular: Equirectangular projectionfisheye: Fisheye projection
flat: (Optional) When viewing in 2D, set the display mode.left: (Default) Show the left eye image.right: Show the right eye image.wiggle: Alternate between left and right images to help the user see the 3D effect.anaglyph: Show a red-cyan anaglyph image.
wiggle: (Deprecated) Use theflat="wiggle"attribute instead.controlslist: (Optional) A space-separated list of controls to display.vr: Show the "Enter VR" button.left: Allow the "left" flat mode.right: Allow the "right" flat mode.wiggle: Allow the "wiggle" flat mode.anaglyph: Allow the "anaglyph" flat mode.
This component has been manually tested to load pictures taken with the following cameras:
| Status | Camera | Picture type | Attributes required | Field of view | Orientation |
|---|---|---|---|---|---|
| ✔️ | Lenovo Mirage Camera | VR180 | (none) | ✓ | ✓ |
| ✔️ | Canon RF5.2mm F2.8 L Dual Fisheye unprocessed | left-right fisheye | (none) | X | X |
| ✔️ | Canon RF5.2mm F2.8 L Dual Fisheye processed with EOS VR Utility | left-right | (none) | X | X |
| ✔️ | Insta360 Evo | left-right | (none) | X | X |
| ✔️ | CALF VR180 | left-right | (none) | X | X |
| ✔️ | CALF VR180 | "vr180" | angle="180" |
X | X |
| ✔️ | Kandao QooCam EGO 3D Camera | left-right | (none) | X | X |
| ✔️ | Pixel phone | depth | type="depth" |
X | X |
| ❌ | Vision Pro |
This component has been manually tested on the following hardware, OS and browsers:
| Hardware | OS | Browser | Status |
|---|---|---|---|
| HTC Vive | Windows | Chrome | ✔️ |
| HTC Vive | Windows | Firefox | ✔️ |
| HTC Vive | Windows | Firefox Reality | ✔️ |
| Cardboard | Android | Chrome | ✔️ |
| Cardboard | Android | Firefox | ❌ |
| Cardboard | iOS | ❌ #18 | |
| Quest 1 | Default | ✔️ | |
| Quest 2 | Default | ✔️️ | |
| Quest 3 | Default | ✔️️ | |
| Vision Pro | Safari | ❌ #34 |
Instead of a CDN, you can install the module locally using npm:
npm install stereo-imgThen, use a JavaScript builder or import-maps to load the module and its dependencies:
If using import-maps:
<!-- Shim for importmap -->
<script async src="https://unpkg.com/[email protected]/dist/es-module-shims.js"></script>
<script type="importmap">
{
"imports": {
"stereo-img": "./node_modules/stereo-img/stereo-img.js",
"exifr": "./node_modules/exifr/dist/full.esm.js",
"three": "./node_modules/three/build/three.module.js",
"three/": "./node_modules/three/"
}
}
</script>Then load the stereo-img module:
<script type="module">import "stereo-img";</script>