Deep zoom
The deep zoom viewer opens pictures far too large to load at once - microscope slides, scanned maps and drawings, artwork photographed in sections, aerial mosaics - and moves through them smoothly, because only the part on screen is read, at the detail the screen needs. It reads Deep Zoom, IIIF and Zoomify tiles from a server, TIFF and BigTIFF of any size from the visitor's computer or a server - slide scans such as Aperio SVS and OME-TIFF among them - and ordinary JPEG, PNG and WebP.
Pan, zoom and pinch; turn and mirror; find your way with the overview map. Compare two pictures side by side or with a swipe divider, moving together. Draw rectangles, ellipses, polygons, freehand outlines, points and measurements, labelled and coloured, kept as JSON or GeoJSON; measure in real units from the picture's own pixel size or a line of known length; place your page's own elements on the picture; and save the view, or a region at full detail, as PNG.
Try it with your own files in confidence: they are opened by your browser, on your device. Nothing is uploaded, no copy reaches us or anyone else, and nothing is kept once you close this tab.
Eight hundred gigapixels
The Mandelbrot set at 1,048,576 by 786,432 pixels, computed tile by tile on background threads as you zoom - no file is downloaded. A few places are marked: go to each in turn, turn the picture, or compare it with a second colouring side by side. Open a TIFF, JPEG or PNG of your own from the viewer's toolbar.
// Node 20 or later, from the Gold package: each new slide scan's size, levels and pixel size, read without decoding it.
import { openAsBlob } from 'node:fs';
import { blobSource, readTiff, tiffPyramid, tiffPixelSize, formatMicrometres } from './dist/node/bmx-deep-zoom.mjs';
const tiff = await readTiff(blobSource(await openAsBlob('scans/slide-0412.svs')));
const pyramid = tiffPyramid(tiff);
const um = tiffPixelSize(pyramid[0]);
console.log(`${pyramid[0].width} × ${pyramid[0].height} px, ${pyramid.length} levels, ${um ? formatMicrometres(um) + ' a pixel' : 'no pixel size'}`);
A rock section, measured
A made-up thin section of granite as a geology lab might photograph it under the microscope, 6,000 by 4,000 pixels at half a micrometre each - so three millimetres across. One grain is outlined and measured already. Measure another, draw round it, then take the annotations away as GeoJSON or save the view.