From 880178d62e18dafa56cfa78190848af11ffe161a Mon Sep 17 00:00:00 2001 From: Paul Armstrong Date: Sun, 31 Jan 2021 16:43:12 -0800 Subject: [PATCH] refactor(web): render CameraImage to a canvas --- web/src/components/CameraImage.jsx | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/web/src/components/CameraImage.jsx b/web/src/components/CameraImage.jsx index 62aa5e4053..b1634c95d3 100644 --- a/web/src/components/CameraImage.jsx +++ b/web/src/components/CameraImage.jsx @@ -7,8 +7,9 @@ export default function CameraImage({ camera, onload, searchParams = '' }) { const { data: config } = useConfig(); const apiHost = useApiHost(); const [availableWidth, setAvailableWidth] = useState(0); - const [loadedSrc, setLoadedSrc] = useState(null); + const [hasLoaded, setHasLoaded] = useState(false); const containerRef = useRef(null); + const canvasRef = useRef(null); const { name, width, height } = config.cameras[camera]; const aspectRatio = width / height; @@ -35,15 +36,17 @@ export default function CameraImage({ camera, onload, searchParams = '' }) { aspectRatio, height, ]); + const scaledWidth = useMemo(() => Math.ceil(scaledHeight * aspectRatio), [scaledHeight, aspectRatio]); const img = useMemo(() => new Image(), [camera]); img.onload = useCallback( (event) => { - const src = event.srcElement.currentSrc; - setLoadedSrc(src); + setHasLoaded(true); + const ctx = canvasRef.current.getContext('2d'); + ctx.drawImage(img, 0, 0, scaledWidth, scaledHeight); onload && onload(event); }, - [searchParams, onload] + [setHasLoaded, onload, canvasRef.current] ); useEffect(() => { @@ -54,12 +57,13 @@ export default function CameraImage({ camera, onload, searchParams = '' }) { }, [apiHost, name, img, searchParams, scaledHeight]); return ( -
- {loadedSrc ? ( - {name} - ) : ( - - )} +
+ + {!hasLoaded ? ( +
+ +
+ ) : null}
); }