import React, { useState } from 'react'; import { Upload, Eye } from 'lucide-react'; export default function StereoPhotoViewer() { const [leftImage, setLeftImage] = useState(null); const [rightImage, setRightImage] = useState(null); const [fileName, setFileName] = useState(''); const [error, setError] = useState(''); const parseMPO = async (file) => { setError(''); setFileName(file.name); try { const arrayBuffer = await file.arrayBuffer(); const dataView = new DataView(arrayBuffer); // Check for JPEG SOI marker if (dataView.getUint16(0) !== 0xFFD8) { throw new Error('Not a valid JPEG/MPO file'); } const images = []; let offset = 2; // Find all JPEG images in the MPO file while (offset < arrayBuffer.byteLength - 1) { // Look for SOI marker (0xFFD8) if (dataView.getUint16(offset) === 0xFFD8) { const startOffset = offset; offset += 2; // Find EOI marker (0xFFD9) while (offset < arrayBuffer.byteLength - 1) { if (dataView.getUint16(offset) === 0xFFD9) { offset += 2; const imageData = arrayBuffer.slice(startOffset, offset); const blob = new Blob([imageData], { type: 'image/jpeg' }); images.push(URL.createObjectURL(blob)); break; } offset++; } } else { offset++; } } if (images.length >= 2) { setLeftImage(images[0]); setRightImage(images[1]); } else if (images.length === 1) { setLeftImage(images[0]); setRightImage(null); setError('Only one image found in file'); } else { throw new Error('No valid images found in MPO file'); } } catch (err) { setError(err.message || 'Error parsing MPO file'); setLeftImage(null); setRightImage(null); } }; const handleFileChange = (e) => { const file = e.target.files?.[0]; if (file) { parseMPO(file); } }; return (

Stereo Photo Viewer

Load MPO files to view left and right stereo images

{fileName && (

Loaded: {fileName}

)}
{error && (

{error}

)} {(leftImage || rightImage) && (

Left Image

{leftImage ? ( Left stereo view ) : (

No left image

)}

Right Image

{rightImage ? ( Right stereo view ) : (

No right image

)}
)} {!leftImage && !rightImage && !error && (

Upload an MPO file to get started

)}
); }