UNPKG

photoswipe-deep-zoom-plugin

Version:

A plugin that adds tile-based zoom support to PhotoSwipe. Supports Deepzoom and Zoomify tile formats.

203 lines (128 loc) 5.9 kB
# PhotoSwipe Tiled Deep Zoom Plugin **[> Plugin demo <](https://dimsemenov.github.io/photoswipe-deep-zoom-plugin/)** A plugin that adds tile-based zoom support to PhotoSwipe. Supports Deepzoom and Zoomify tile formats. Unlike conventional viewers such as [OpenLayers](https://openlayers.org/en/latest/examples/zoomify.html) or [OpenSeaDragon](https://openseadragon.github.io/), it displays tiles only when user zooms beyond the primary image size. If user does not zoom - PhotoSwipe operates as usual. If you just want to display a single tiled image, consider using OpenLayers, OpenSeaDragon or Leaflet. ### Initialization The plugin requires a single JS file [photoswipe-deep-zoom-plugin.esm.js](photoswipe-deep-zoom-plugin.esm.js). To view the source code visit [src/](src/). Or install via NPM `npm install photoswipe-deep-zoom-plugin`. ```js import PhotoSwipeLightbox from './lib/photoswipe/photoswipe-lightbox.esm.js'; import PhotoSwipe from './lib/photoswipe/photoswipe.esm.js'; import PhotoSwipeDeepZoom from './photoswipe-deep-zoom-plugin.esm.js'; const lightbox = new PhotoSwipeLightbox({ gallery: '#gallery', children: '.pswp-gallery__item', pswpModule: PhotoSwipe, // Recommended PhotoSwipe options for this plugin allowPanToNext: false, // prevent swiping to the next slide when image is zoomed allowMouseDrag: true, // display dragging cursor at max zoom level wheelToZoom: true, // enable wheel-based zoom zoom: false // disable default zoom button }); const deepZoomPlugin = new PhotoSwipeDeepZoom(lightbox, { // deep zoom plugin options, for example: tileSize: 256 }); lightbox.init(); ``` HTML for a single slide: ```html <div id="gallery" class="pswp-gallery"> <a class="pswp-gallery__item" href="primary-image.jpg" target="_blank" data-pswp-width="1600" data-pswp-height="1024" data-pswp-tile-type="deepzoom" data-pswp-tile-url="path/to/tiles/{z}/{x}_{y}.jpeg" data-pswp-max-width="5832" data-pswp-max-height="4409"> <img src="thumbnail.jpg" alt="Image #1" /> </a> <!-- more slides ... --> </div> ``` Or as slide data: ```js const slides = [ { src: 'primary-image.jpg', w: 1600, h: 1024, msrc: 'thumbnail.jpg', tileType: 'deepzoom', tileUrl: 'path/to/tiles/{z}/{x}_{y}.jpeg', tileSize: 254, tileOverlap: 1, maxWidth: 5832, maxHeight: 4409 }, // more slides... ]; ``` #### `data-pswp-tile-url` Tile URL. Can be also defined as `tileUrl` property of the slide data. For example: `https://example.com/images/my-image/{z}/{x}_{y}.jpg`. `{z}`, `{x}` and `{y}` will be automaticlaly replaced with the corresponding tile coordinates. If you're using Zoomify type, there in an additional template string `{zoomify_group}`. For example: ``` https://example.com/images/my-image/TileGroup{zoomify_group}/{z}-{x}-{y}.jpg" ``` #### `data-pswp-tile-type: 'deepzoom'` `deepzoom` and `zoomify` tile types are supported for now. Can be also defined as `tileType` property of the slide data. #### `data-pswp-max-width` and `data-pswp-max-height` Maximum size of the tiled image. #### `data-pswp-max-zoom-width` Optional. Controls how far the image can be zoomed, can be lower or higher than max-image-width. ### Tile sources For now, the plugin only supports Zoomify and Deepzoom tiles. You may use [Vips](https://www.libvips.org/API/current/Making-image-pyramids.md.html) to generate them. ### Options #### `fadeInDuration: 150` Fade in animation duration for tiles when loaded, can be zero. #### `cacheLimit: 200` Number of tiles to keep cached. #### `maxDecodingCount: 15` Maximum decoding requests at a time. #### `minBatchRequestCount: 6` Batch requests together, so they aren't sent one at a time when `maxDecodingCount` is reached. #### `tileSize: 256` Default tile width. Individual slides can override it via `data-pswp-tile-size` attribute or `tileSize` property of the slide data. #### `tileOverlap: 0` Default tile overlap. Individual slides can override it via `data-pswp-tile-overlap` attribute or `tileOverlap` property of the slide data. #### `incrementalZoomButtons: true` Zoom in and zoom out buttons in the toolbar. #### `useLowResLayer: false` Will permanently display a low-resolution layer below the active one. #### `forceWillChange: true` Will apply `will-change:transform` to the placeholder and the primary PhotoSwipe image. #### `getTileUrlFn` A function that should return the individual tile URL. For example: ``` getTileUrlFn: (slideData, x, y, z) { return slideData.tileUrl .replace('{x}', x) .replace('{y}', y) .replace('{z}', z); } ``` #### `maxTilePixelRatio: 1` The viewer will load higher resolution tiles earlier on high DPI screens. For example, if device pixel ratio is `2` (regular retina screen) and `maxTilePixelRatio: 2`, the viewer will render twice as many tiles. If device pixel ratio is higher than `maxTilePixelRatio`, the viewer will render tiles according to the `maxTilePixelRatio` option. If it is lower - it'll render according to the device pixel ratio. ### Build To build and minify JS in `dist/`: ``` npm run build ``` To update GitHub pages: ``` npm run publish:demo ``` ### Changelog #### v1.1 - High dpi screens support, added option `maxTilePixelRatio`. - Added property `pswp-max-zoom-width` (`pswpMaxZoomWidth`) that allows increasing or reducing how far the slide can be zoomed. - The plugin now adjusts behaviour of the loading indicator, it's displayed when tiles are loading. - Added zoom keyboard shortcuts (`+` and `-`). - Added reset zoom button, it's displayed when zoomed beyond x3 of the initial state.