{"id":13803682,"url":"https://github.com/libvips/vipsdisp","last_synced_at":"2026-03-16T16:39:04.497Z","repository":{"id":34096116,"uuid":"37921431","full_name":"jcupitt/vipsdisp","owner":"jcupitt","description":"Tiny libvips / gtk+4 image viewer","archived":false,"fork":false,"pushed_at":"2025-01-26T10:19:09.000Z","size":23387,"stargazers_count":153,"open_issues_count":10,"forks_count":11,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-04T01:43:31.856Z","etag":null,"topics":["gtk4","image","image-viewer","libvips"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jcupitt.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-06-23T13:43:54.000Z","updated_at":"2025-04-03T11:53:20.000Z","dependencies_parsed_at":"2023-10-27T07:24:43.785Z","dependency_job_id":"62c2a9a5-7da2-4f1c-84ab-0760e333ff22","html_url":"https://github.com/jcupitt/vipsdisp","commit_stats":{"total_commits":624,"total_committers":8,"mean_commits":78.0,"dds":0.1875,"last_synced_commit":"c8ea3fceafd5832461656d4a7c75d968df197430"},"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcupitt%2Fvipsdisp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcupitt%2Fvipsdisp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcupitt%2Fvipsdisp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jcupitt%2Fvipsdisp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jcupitt","download_url":"https://codeload.github.com/jcupitt/vipsdisp/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248632233,"owners_count":21136648,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gtk4","image","image-viewer","libvips"],"created_at":"2024-08-04T01:00:36.865Z","updated_at":"2026-03-16T16:39:04.477Z","avatar_url":"https://github.com/jcupitt.png","language":"C","funding_links":[],"categories":["Graphics"],"sub_categories":["Image Viewers"],"readme":"# vipsdisp\n\nVipsdisp can display huge (many, many gigabyte) images quickly and without\nusing much memory. As well as the usual PNG, JPG, TIF, PDF, SVG, WEBP,\nJP2, JXL and GIF, it supports many scientific and technical image formats,\nincluding RAW, SVS, MRXS, OpenEXR, FITS, Matlab, NIfTI, Analyze, and\nPFM. It can also load camera RAW images, and UltraHDR.\n\nVipsdisp supports pixel types from 1 bit mono to 128-bit double precision\ncomplex, you can convert image formats, it implements copy-paste and drag-drop,\nand it has a range of useful visualisation tools and display modes.\n\nThe vipsdisp image widget is [used by the image processing spreadsheet\nnip4](https://github.com/jcupitt/nip4) for image display, so that might be\na better program if you want to do more than just view images.\n\n## Screenshots\n\nIt all works, though see the TODO list below.\n\n[![Screenshot](screenshots/overview.png)](screenshots/overview.png)\n\n[![Screenshot](screenshots/visualisation.png)](screenshots/visualisation.png)\n\n[![Screenshot](screenshots/save-as.png)](screenshots/save-as.png)\n\n[![Screenshot](screenshots/animation.png)](screenshots/animation.png)\n\nhttps://youtu.be/KSoBkO2_HtE\n\n## Install\n\nFor linix, this program is on flathub, see:\n\nhttps://flathub.org/apps/org.libvips.vipsdisp\n\nJust click \"install\", or enter:\n\n```shell\nflatpak install flathub org.libvips.vipsdisp\n```\n\nUse homebrew to install on macOS, and for Windows there are [x64 and arm64\nWindows binaries for each \nrelease](https://github.com/jcupitt/vipsdisp/releases). Just unzip and run \nthe exe.\n\nIf you see rendering problems on Windows, it's worth trying another backend.\nBy default, vipsdisp uses Vulkan to draw the UI, and this can be a bit wonky\non some older versions of win.\n\nIf you see something like a blank window on startup, try:\n\n```console\n\u003e set GSK_RENDERER=cairo\n\u003e vipsdisp\n```\n  \nThat will use a software only fallback to draw the UI and should work on any\nversion of Windows, though it will be a bit slower.\n\n## Features\n\n* It supports many scientific and technical image formats, including TIFF,\n  WEBP, JP2K, JXL, RAW, HEIC, AVIF, PNG, JPEG, SVS, MRXS, OpenEXR, GIF, PDF, \n  UHDR, SVG, FITS, Matlab, NIfTI, Analyze, etc. It supports many numeric pixel \n  types, any number of image bands, and many colour spaces.\n\n* It doesn't need to keep the whole image in memory. It will only read parts \n  that it needs for display, and it understands most tiled and pyramidal\n  image formats.  This means you can open and view huge images quickly.\n\n* It has threaded, asynchronous display repaint, so pixels are\n  computed in the background by a pool of workers. The interface stays live\n  even under very heavy load.\n\n* It keeps a sparse pyramid of computed tiles as textures on the GPU. Each\n  frame, it computes the set of visible tiles, and then the GPU scales,\n  positions and composites just those tiles to the screen. CPU load should\n  be low (except for the background workers heh). Hold down i (for \"in\")\n  or + to do a smooth zoom on the cursor. If you press \"d\" it toggles a\n  debug display mode which shows the tiles being computed.\n\n* It supports high-DPI displays, so selecting 1:1 zoom will map one image\n  pixel to one display hardware pixel. \n\n* Select **Display Control Bar** from the top-right menu and a useful\n  set of visualization options appear. It supports four main display modes:\n  **Toilet Roll** (sorry), **Multipage**, **Animated**, and **Pages as\n  Bands**.\n\n* In **Toilet Roll** mode, a multi-page image is presented as a tall, thin\n  strip of images. In **Multipage**, you see a single page at a time, with\n  a page-select spinner (you can also use the `crtl-\u003c` and `ctrl-\u003e` keys to\n  flip pages). In **Animated** mode, pages flip automatically on a timeout.\n  In **Pages as Bands** mode, many-page single-band images (eg. OME-TIFF)\n  are presented as a single colour image.\n\n* You can select false colour and log-scale filters, useful for many scientific\n  images. Scale and offset sliders let you adjust image brightness to see into\n  darker areas (useful for HDR and many scientific images).\n\n* Select **Save as** to write an image. It can write most common formats,\n  and lets you set file save options. It can write things like DeepZoom\n  pyramids, PFM, OpenEXR, and so on.\n\n* Select **Properties** (alt-Enter) to see image metadata. It can display large\n  amounts of metadata (useful for eg. DICOM) with filtering.\n\n* Use alt-Left and alt-Right to move through the set of images being\n  displayed -- very handy for browsing a directory of images. If you drag\n  or load a set of images, it'll flip between the images in the set. If you\n  drag or load a single image, it'll flip between all the images in that\n  directory.\n\n* It keeps the most recent three views live, so you can flip between them very\n  quickly, and all view settings are preserved. This is handy for comparing\n  details on two images.\n\n* **Duplicate Window** or crtl-D makes a copy of the window, so you can\n  compare two images side by side.\n\n* It supports copy/paste and drag/drop of filenames, sets of filenames, and\n  textures. You can paste from the screenshot tool, or drag-drop images from\n  your file browser, for example.\n\n* It uses the gtk4 GUI toolkit, so the interface is fast, attractive\n  and nicely animated. The image is rendered with the GPU, so display ought to\n  be quick.\n\n## Shortcuts\n\n* Cursor keys to scroll around\n* Cursor keys plus shift to move by a screen size\n* Cursor keys plus ctrl to move to image edges\n* Number keys to pick a particular magnification\n* Ctrl + number keys to pick a particular zoom out\n* 0 for best fit\n* d, to toggle debug rendering mode\n* i, + / o, - to zoom in and out\n* ctrl-\u003c / ctrl-\u003e. prev page, next page\n* alt-Left / alt-Right. prev image, next image\n* Mouse drag to pan\n* Mousewheel to zoom\n* Mousewheel + shift/ctrl to pan\n* ^O replace image\n* ^S save image\n* ^N new viewer\n* ^D duplicate view\n* alt-Enter toggle properties\n* ^C / ^V copy paste of filenames, lists of filenames and textures\n* F11 fullscreen\n\nAdditionally, you can drag and drop filenames, lists of filenames and\ntextures.\n\n## Build from source\n\n```shell\ncd vipsdisp\nmeson setup build --prefix=~/vips\ncd build\nninja\nninja install\n```\n\nAnd to run:\n\n```shell\nexport GSETTINGS_SCHEMA_DIR=/home/john/vips/share/glib-2.0/schemas\nvipsdisp ~/pics/k2.jpg\n```\n\n## Version bump checklist\n\nVersion needs updating in the following places:\n\n- **`CHANGELOG.md`**\n\n- **`meson.build`**\n\n- **`org.libvips.vipsdisp.metainfo.xml`** and some release notes and a date as\n  well. Be exttremely careful with date formatting, and include leading zeros\n  on the day and month.\n\n- **`org.libvips.vipsdisp.json`** needs the version number as a git tag.\n\n## flatpak\n\nAdd the `flathub` repo:\n\n```shell\nflatpak remote-add --if-not-exists \\\n  flathub https://flathub.org/repo/flathub.flatpakrepo\n```\n\nInstall the gtk4 SDK and runtime:\n\n```shell\nflatpak install org.gnome.Sdk//49\nflatpak install org.gnome.Platform//49\n```\n\nAllow file. Recent security changes to git will cause submodule checkout\nto fail inside flatpak. If you get errors like `fatal: transport 'file'\nnot allowed`, re-enable file transport with:\n\n```shell\ngit config --global protocol.file.allow always\n```\n\nBuild and try running it:\n\n```shell\nflatpak-builder --force-clean --user --install build-dir org.libvips.vipsdisp.json\nflatpak run org.libvips.vipsdisp ~/pics/k2.jpg\n```\n\nForce a complete redownload and rebuild (should only rarely be necessary) with:\n\n```shell\nrm -rf .flatpak-builder\n```\n\nCheck the files that are in the flatpak you built with:\n\n```shell\nls build-dir/files\n```\n\nUninstall with:\n\n```shell\nflatpak uninstall vipsdisp\n```\n\n## Notes on flatpak build process\n\n- niftiio is annoying to build, skip it.\n\n## Packaging for flathub\n\nInstall the appdata checker:\n\n```shell\nflatpak install flathub org.freedesktop.appstream-glib\nflatpak run org.freedesktop.appstream-glib validate org.libvips.vipsdisp.metainfo.xml\n```\n\nAlso:\n\n```shell\ndesktop-file-validate org.libvips.vipsdisp.desktop \n```\n\n## Uploading to flathub\n\nMake a PR on:\n\n        https://github.com/flathub/org.libvips.vipsdisp \n\nthen check the build status here:\n\n        https://flathub.org/builds/#/apps/org.libvips.vipsdisp\n\nOn success, merge to master.\n\n## Build for Windows\n\nUse the libvips Windows build system:\n\nhttps://github.com/libvips/build-win64-mxe/tree/master\n\nClone and run:\n\n```\n./build.sh --target x86_64-w64-mingw32.shared vipsdisp\n```\n\n## TODO\n\n- skip unknown files on next / prev?\n\n    - need to add the test to next-image, not glob, since we can't test the\n      whole dir on startup\n\n    - need to use next-image to pick the start image (not always the first)\n\n    - need to *not* do this if only one file specified, eg. `vipsdisp x.txt`\n\n- ^C during a slow load leaves a file in /tmp, can we improve this?\n\n- batch save?\n\n- have a look at the new 4.14 `gtk_print_dialog_new()`\n\n    works and is in branch add-print-dialog, but it needs 4.14, and the new\n    print API is still unstable\n\n- allow eg. \"vipsdisp x.svg[scale=10]\", the load dialog should have a\n  \"load options\" expander\n\n- can we move `new_from_file` into a bg thread? the GUI will pause on huge\n  SVGs on zoom change right now\n\n    very difficult with the current structure -- we'd need to separate\n    tilesource and tilecache completely, and perhaps link them with signals\n\n- need to separate page and zoom for ome-tiff, since we have many-page\n  subifd pyramids\n\n    - useful for fixing PDF zoom in the way we fixed SVG zoom too\n\n- zooming:\n\n    - better pinch zoom support\n\n        we should take the coordinates of the pinch gesture into account\n\n        can test this now I have a multitouch trackpad\n\n    - we could shrink tiles on zoom out (we only expand tiles now)\n\n    - before we can do fancy PDF zooming, we'll need to split page and zoom in\n      tile_source_open()\n\n- how should we handle images which include labels, macros, thumbnails?\n\n    - load options? save options? \n\n    - display images in properties? perhaps a thumbnail? set\n      attach-associated?\n\n      appear as eg.:\n\n        openslide.associated.thumbnail    1024x732 uchar, 4 bands, srgb\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibvips%2Fvipsdisp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flibvips%2Fvipsdisp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibvips%2Fvipsdisp/lists"}