QuickImageViewer (qIV)

A blisteringly fast, GPU-accelerated native C++23 image viewer for Windows 10 and 11. Zero flicker, zero telemetry, sub-10 MB portable executable — no installer needed.

Free & Open Source C++23 Native Direct2D GPU Cache Portable App 20+ Formats Android Remote App

View Source on GitHub

1.0k downloads 12 stars 🚀 38 releases 🏷 v3.1.0.450 latest release 🕒 5 days ago last updated 📦 9.7 MB single .exe 🖼 44 formats 240 shortcuts 📐 79.8k lines of C++ 📄 AGPLv3 licence 🖥 Windows 10 & 11

Why QuickImageViewer?

Built for Speed

Unlike modern web-based Electron wrappers, qIV is a pure native application. It uses a GPU bitmap cache to keep decoded images in VRAM, preloading in both directions on a background thread pool. The UI thread never blocks — switching between images is instant.

Hardware Accelerated

Built directly on top of Direct2D, D3D11 and the Windows Imaging Component (WIC). Zero-flicker rendering with per-panel DXGI swap chains, full per-monitor DPI awareness for crisp 4K rendering, and a GDI software fallback when needed.

Genuinely Portable

One sub-10 MB EXE. No installer, no background services, no telemetry, no ads. Hide it to the system tray with Esc and the process stays resident in RAM — the next image opens instantly.

More Than a Viewer

Cull a shoot in one pass — one keystroke per picture, keep or reject, rejects moved together at the end. Thumbnail strips double as a lightweight file manager: drag & drop files between folders, right-click Copy / Cut / Paste / Delete with full Windows clipboard and Recycle Bin integration, plus offline EXIF GPS geocoding.

Format Support

Open HEIC, AVIF, JPEG XL, WebP, SVG, OpenEXR and Radiance HDR on Windows — plus every classic format. Native OS formats are handled by the zero-dependency Windows Imaging Component, while complex formats use optimized custom and static-library decoders.

Format Extensions Decoder Notes
JPEG .jpg .jpeg .jpe WIC Full EXIF / GPS metadata
PNG .png .apng WIC 16-bit, alpha
BMP .bmp WIC
TIFF .tif .tiff WIC Multi-page (first frame)
GIF .gif WIC Animated — plays with per-frame delays
WebP .webp WIC Windows 10+ native codec
HEIF / HEIC .heif .heic .hif .heics .heifs WIC Requires MS HEIF Extensions
AVIF .avif .avci .avcs .avifs WIC Windows 11 native codec
JPEG XL .jxl WIC Windows 11 24H2+ native codec
JPEG XR .jxr .wdp .hdp WIC OS native
DDS .dds WIC OS native
Camera RAW .dng .cr2 .cr3 .nef .arw WIC Requires MS Raw Image Extension
JPEG 2000 .jp2 .j2k .j2c .jpf .jpx OpenJPEG Static lib
SVG .svg resvg Rust static lib, async IO thread
OpenEXR .exr tinyexr Reinhard tone-map + γ2.2
Radiance HDR .hdr Inline RGBE adaptive RLE, Reinhard tone-map
Targa .tga Inline RLE and colour-mapped, 8/15/16/24/32-bit
PNM .ppm .pgm .pbm Inline P1–P6, up to 16-bit maxval
QOI .qoi Inline Lossless fast format
ICO / CUR .ico .cur WIC

Core Features

Performance

Finding pictures

Culling a shoot

Guides

File Management

Theming — a dial, not a switch

Most viewers give you dark or light. qIV gives you every point between them, live. Ctrl+Alt+Num + and Ctrl+Alt+Num - move a single theme factor from 0.0 to 1.0 in steps of 0.05 — 21 stops from full dark to full light. Every panel, scrollbar, overlay and window background re-tints as you press, with no restart. Ctrl+Alt+Num 0 returns to the default.

It is one formula, applied to each colour channel independently: Final = Base + factor × (1 − 2 × Base).

Two neighbouring controls change the window's material rather than its colour, both Windows 11 22H2+ and silently ignored on older builds: Ctrl+Shift+Num * toggles rounded ↔ square corners, and Ctrl+Shift+Num / cycles the backdrop None → Mica → Acrylic → MicaAlt.

Offline Reverse Geocoding

GPS coordinates in EXIF data are resolved to full location details with zero network calls. All data is compressed (zlib) and embedded directly in the EXE.

Data Source Entries Shows
Cities GeoNames cities1000 170,387 City name, timezone
Admin1 admin1CodesASCII 3,865 State / Province
Admin2 admin2Codes 47,549 District / County
Country countryInfo 252 Country, Capital, Continent, Currency, Phone prefix

Complete Shortcut Reference

Every shortcut in qIV — all 240 of them, in 17 sections — has its own page, generated from the application's own help panel so it can never fall behind the build:

Or press F1 in the app for the same list, on your own machine, with your own keyboard layout.

System Tray

When qIV is hidden or running in the background, its icon lives in the system tray. Right-click it for the full settings menu — no config files to edit. Double-click to restore the window.

Settings submenu — toggles

Setting Effect
Keep in Background Esc / Ctrl+W hides to tray instead of exiting; process stays resident for instant re-open
Run on Startup Write / remove a Windows startup registry entry so qIV launches with Windows. Dedicated instances use a separate entry
Thumbnail Effects Master switch for glow borders, rounded corners and hover-scale on thumbnail strips
History: Open Full List Tab opens the full uncapped history view when enabled
Info Overlays Show / hide all nine overlay text slots
Open Thumbnail Strip on Start Auto-open the directory strip on every launch
Folder Walk Wraps Around Whether Alt+Left / Alt+Right roll from the last sibling folder back to the first. On by default; off stops at each end and says so
Overlay Background Semi-transparent background panel behind overlay text
Swap Mouse Buttons Exchange left/right roles: hold-to-zoom ↔ drag-to-move-window
Invert Scroll Direction Reverse vertical wheel for image navigation
Invert Horizontal Scroll Reverse horizontal wheel for folder history navigation
Start in Fullscreen Open fullscreen on every launch

Settings submenu — numeric values

Click any numeric label to open an input dialog. Current value is shown in the menu item itself.

Setting Range Effect
VRAM Cache Size 0 – 999 Images to keep decoded in GPU memory
Window Width / Height 240 – 16000 px Default dimensions used by Ctrl+Space and window reset
Dir Thumb Cache 0 – your card's VRAM Memory budget for directory thumbnail bitmaps. 0 turns the cache off, keeping only the thumbnail on screen; the maximum is this card's own graphics memory, which the dialog shows when it can read it. The Statistics panel reports both the budget and the card's total
Preload Lookaside 1 – 99 Images to pre-decode ahead and behind the current one
Overlay Message Duration 250 – 10000 ms How long center overlay messages stay visible

Settings file operations

Export and Import moved to the top-level Backup & Export menu, with the log and TCP/IP archives.

Item Effect
Restore Defaults Reset every setting to its compiled-in default — confirmation required; history and favorites are not affected

Settings › History

Everything about the folder history in one place — what gets recorded, how much of it is shown, and how to tidy it up.

Setting Default Effect
Record Folders I Visit On Master switch. Off stops new folders reaching the list and qivHistory.txt. Nothing already saved is removed, and navigation is unaffected
Record Only Folders With Images On Folders holding no images are not recorded — what stops the Alt+arrow folder walk filling the history with folders you merely stepped through. A folder dropped on the window is recorded either way
Tab Opens Full List Off Tab opens the uncapped list. Ctrl+Tab opens it once whatever this is set to, so the setting picks the default rather than the only way in
Rows Shown in Panel 0 – 999 How many history rows the panel draws. Display only
Favorite Rows Shown in Panel 0 – 999 How many favorite rows the panel draws. Display only
Favorites You Can Add 0 – 999 How many folders may be starred at once. Also caps qivFavorites.txt on load, merge and save — lowering it drops favorites past the new limit
Folders Saved to File 1 – 99999 How many folders qivHistory.txt keeps; oldest dropped past this
Remove Invalid Folders action Drops rows that cannot be parsed as a path, point at a missing folder, or hold no images. Rows the background scan has not reached yet are kept and reported, so an early run says it was partial
Remove Duplicates action Collapses repeats, keeping the most recent. Usually removes nothing from the list — the real work is rewriting the append-only file
Clear History action Removes every non-favorite folder from the list and the file
Clear Favorites action Un-stars everything and empties qivFavorites.txt. The folders stay in the history, only the star goes
Clear History and Favorites action Empties both lists and both files in one action
Open History File action Selects qivHistory.txt in Explorer

Every action asks first and backs up the file it is about to change, so any of them can be undone with Backup & Export › Restore History & Favorites. Remove Invalid Folders and Remove Duplicates never touch favorites; the three Clear items are the only ones that do, and each names what survives it.

Backup & Export

Every operation that moves qIV's data on and off the disk, in one top-level menu.

Item Effect
Export Settings Save all settings to a UTF-8 .ini file (filename includes today's date)
Import Settings Load a previously exported .ini — confirmation required; all settings applied immediately
Backup Logs Zip the whole logs folder, general and network together, to a location you choose. One-way — a log is a record, there is nothing to restore it into
Backup TCP/IP Config Zip qivLocalServer.ini, qivRemoteServers.ini and qivRemoteServerBlacklist.ini. None of these are in the registry, so Export Settings never covered them
Restore TCP/IP Config Restore those three files. Asks per file before replacing one that already exists, and needs a restart — a running listener keeps the settings it started with
Backup History & Favorites Export history and favorites to a .zip archive
Restore History & Favorites Restore from a previously created backup — confirmation required

The TCP/IP archive holds your allow-list and the stored password hash (PBKDF2, not plaintext) — keep it as private as the configuration itself. The logs archive is the one meant to be handed to somebody else.

Other submenus

Submenu What you can change
View Mode Default fit mode: Fit to view · Fit to width · Fit to height · Stretch · Original size
Slideshow Interval (100 – 60000 ms), Loop, Shuffle, transition type (Cut / Fade / Dissolve / Ripple / Push / Zoom)
Sort Sort order (Name / Date / Size / Type / Disk) and Reverse Order toggle — takes effect immediately
Backup Backup history & favorites to a .zip archive, or restore from a previous backup
Logging General Log — what qIV itself did: started, closed, and whether the previous run ended abnormally (with the crash dump's filename when there is one). TCP/IP Log — every line exchanged with a remote client, the same traffic the Server Log panel shows (Ctrl+F12), written to disk as well. Open Log Folder opens logs\ in Explorer

Both logs are off by default and survive a restart once switched on — which is the point of them. A screen that misbehaves at four in the morning is exactly the one nobody was watching, so the setting is persisted rather than something you must remember to enable first.

Files land in logs\general\ and logs\network\ beside the EXE, named QuickImageViewer_General_<timestamp>.log and QuickImageViewer_Tcp_IP_<timestamp>.log, rotating every 5000 lines. Switching a log off and on again continues the newest file rather than starting a fresh one.

The format is the standard time [thread] LEVEL message layout, so LogViewPlus, lnav and similar tools parse it with no configuration — and a rotated TCP/IP file opens straight back in the Server Log panel with Ctrl+O. Writing happens on a thread of its own: a slow disk cannot stall the viewer, and with a log switched off the cost at each record point is a single atomic read.

Dedicated Screens

Press F8 for the Dedicated panel. A dedicated screen is a separate copy of qIV with its own settings file beside it — normally parked fullscreen on one monitor running a slideshow. Any number can run at once, alongside the main app, sharing nothing.

How a copy is identified

Everything derives from the executable's own path, so two screens can never resolve to the same settings, mutex or window class — two files cannot share a name in one folder.

D:\Screens\qIV_dedicated_Lobby.exe                  the copy
D:\Screens\qIV_dedicated_Lobby.ini                  its settings
D:\Screens\imageLists_qIV_dedicated_Lobby.qim       image folders
D:\Screens\promotionList_qIV_dedicated_Lobby.qpr    promotion folders

Startup decision

Made from the filesystem before any setting is read:

Condition Result
An .ini sits beside the exe Settings come from it; the registry is never touched
Exe name contains dedicated, no .ini A default .ini is generated and the F8 panel opens
Neither Normal registry-backed launch

Inside the .ini, [Instance]Dedicated decides behaviour — 1/true/on/yes or any non-zero number. Set it to 0 and you get a portable ordinary viewer: settings in a file, history and favorites intact, nothing in the registry.

Panel buttons

Button Action
Generate App Copy this executable to a chosen folder as qIV_dedicated_<name>.exe
Generate Config Write that copy's .ini, holding every setting shown in the panel
Add Images / Add Promotions Append a folder to the .qim / .qpr list — duplicates reported and skipped
Add Startup / Remove Startup Create or delete a shell:startup shortcut pointing at the copy
Test Config / Test Images / Test Promos Check one thing at a time

The panel edits the config only — it never changes the app you are using, and every value starts from the compiled defaults rather than your current settings, so a screen never inherits the authoring machine's preferences.

Test Images / Test Promos count the images actually found per folder and flag folders that are missing or empty. A folder that exists but holds nothing decodable looks identical to a working one until the screen goes blank.

Kiosk lock

Tick Kiosk lock in the panel and the screen ignores every key and every click — nobody walking past can pause the slideshow or open a panel. The tray icon keeps working (its menu runs its own message loop, so the locked window never sees those messages), and Settings › Kiosk Lock there is the only way back in. The main app has the same toggle in its tray menu, and -lock forces it on for a single launch without changing the stored setting.

Always on top

Keeps the screen above every other window so nothing that pops up can cover it. Ctrl+T toggles it live and the setting persists; the panel sets it for a generated screen.

Keep display awake

Blocks the screensaver and display sleep while the window is on screen. Leave it off and Windows eventually blanks the display with nobody there to wake it — and with the kiosk lock on, nobody could. The hold is released automatically when the window hides to the tray, so a viewer sitting in the tray never keeps a machine up.

Isolation

A dedicated screen writes nothing to the registry, keeps no history or favorites, and has its own mutex and window class — so a file opened from Explorer can never land on a slideshow instead of the main window. It auto-starts from a shortcut rather than the Run key.

Promotions

A dedicated screen can interleave a second playlist with its images — never merged into them, and invisible to the image counter and arrow keys.

Setting Meaning
Pick Sequential (folder order) or Weighted by priority
Priority From a #N suffix on the filename — sale#500.jpg is 500× likelier than a file with no suffix. Range 1–65535
Every N images Gap counted in pictures
Every N seconds Gap counted in wall-clock time
Shown for Promotion dwell time, independent of the slide interval

Both triggers are (from, to) pairs and run independently — set either, or both, and whichever comes due first shows a promotion:

  • (0, 0) — off
  • (5, 0) — exactly every 5
  • (5, 15) — re-rolled between 5 and 15 each time, so it never looks mechanical

Remote Control & Mirroring

One qIV can drive others — a wall of screens from the copy on your desk, or a single display in another room. It is a plain UTF-8 line protocol over TCP, so a script, netcat, a home-automation system or a phone app are all first-class clients.

The phone app has its own section — qIV Remote for Android, which speaks exactly the protocol described here.

Shortcut Panel / Action
F9 Local Server — the listener this instance runs. Off unless switched on; needs a name and a port
Ctrl+Alt+S Start / stop the listener — the panel's Start and Stop buttons on one key, without opening it. Reports the address it came up on, or why it would not start. Configures nothing, and is local only: it cannot be sent over the network or mirrored
Ctrl+F9 My Clients — who is connected to your listener right now: address, the name and platform each gave, whether it is encrypted, how long it has been on, and whether it is watching. Kick, kick-for-N-minutes, or ban from here
F10 Remote Servers — the instances this copy can drive. Connect, start / stop, watch, sync
Ctrl+F10 Send Command — pick any wire command from the list, give it a value, send it
F11 Mirroring on / off — forward every mirrorable command to the connected targets
Ctrl+F11 Mirroring — which connected servers receive what this instance does, plus Identify and Watch
F12 While mirroring, also execute here (off = this viewer is a pure remote control)
Ctrl+F12 RemoteLog — every line that crossed the wire, both directions, with round trips — plus a line each time a client arrives, leaves, drops or is refused, naming its address and port and how long it stayed

F11 and F12 are session-only and always start off — a viewer that came back from a restart already driving machines you had forgotten about would be the worst kind of surprise.

Announce (beacon)

First item in the TCP/IP menu, off by default. The server publishes itself over mDNS as _qiv._tcp, so a phone or another qIV finds it in a list instead of being told an address to type. That one step — read your PC's LAN address, type it without a typo on a phone keyboard, know what a port is — is where most people give up.

It announces only the instance name and the port. Never a password, never a path, never a file. And discovery is not access: the AllowList, the password challenge and TLS are untouched by it, so someone who finds this instance and is not allowed in gets exactly as far as someone who guessed the address.

Off by default on purpose — this app's whole posture is that nothing leaves your network unasked, and a machine that started advertising itself the moment you enabled the server would be a change to that made on your behalf. It also only announces while the server is actually running and reachable: with the listener stopped, or bound to 127.0.0.1, the menu says will announce rather than claiming it did.

Putting one picture on another screen

Four keys, one question at four depths.

Key What travels Across machines The far end
Ctrl+Enter a position — folder, sort order, image number ❌ same machine only goes there and stays
Alt+Enter the image bytes, outbound shows it once, unchanged otherwise
Ctrl+Alt+Enter the image bytes, inbound is only read from — you see what it shows
Ctrl+Shift+Enter the same position, to every connected instance ❌ same machine only the whole wall goes there and stays

Ctrl+Shift+Enter is Ctrl+Enter widened: it ignores the Control ticks in Ctrl+F11 and pushes to everything connected, for lining a whole wall up at once without first ticking rows you are about to untick again.

Ctrl+Enter asks before it sends. It queries the target: already in the same folder in the same order? Then just the image number — one round trip, no rescan, no flicker, so you can walk a folder and push each picture as you reach it. In a different folder? Then the folder, then the sort order, then — after waiting for that instance's own scan to finish — the number. Sending a position before the scan lands is the race this avoids.

Alt+Enter and Ctrl+Alt+Enter carry the picture's own file bytes, base64 across several protocol lines, and the far end decodes them with its own decoder. That is why they work to a machine that cannot read your disk. The received image is shown once and changes nothing else: no folder, no sort order, no playlist position. A target running a fullscreen slideshow keeps running it and simply continues from the pushed image — the picture never enters its playlist, and both the received file and its cache entry are thrown away afterwards. An advert dropped between two slides is the case it was built for.

The Send Command panel

Every command has one wire name, spelled exactly like its internal enumerator, and the panel's list is built from the same table the parser accepts — so a name shown there cannot come back “unknown command”.

  • Browse, don't remember — the list is permanent and filterable; names are shown in two blues, the second marking a command that takes a value
  • Descriptions where they belong — what the highlighted command does sits over the list, what its value means sits over the Value box, with units, limits and an example
  • Send to — its own box of connected instances with a checkbox each, so an arbitrary command reaches an arbitrary subset without disturbing what F11 drives
  • Session log — every line sent and every answer, numbered, newest first, with the instance that answered and its round trip

The protocol describes itself

$ nc 127.0.0.1 7777
OK qIV 2.190.0.235 remote v6 [Monitor2]
OK
help
qIV remote protocol v6
FORMAT CMD <name>|<takesValue 0|1>|<description>|<value description>
CMD NextImage|0|next image in the playlist|
CMD JumpToImage|1|go to a numbered image in the current playlist|image NUMBER, 1-based …
…

help lists everything this build accepts with its descriptions, so a client builds its own command list from one call instead of carrying a copy that goes stale. ping checks liveness, version reports the app and protocol version.

Since protocol v5 exactly one line always follows the banner, so a client never has to guess: AUTH <iterations> <salt> <nonce> when the server wants a password, or a bare OK when it does not — which is the OK on the second line above. A successful AUTH is answered OK as well. Nothing is signalled by silence, so no client needs a timeout to discover what kind of server it reached.

Security

Encryption is decided by the address, and never negotiated. A peer on the same machine (127.0.0.0/8, ::1, localhost) gets plaintext; every other peer — your own LAN included — gets TLS 1.2 / 1.3 from the first byte, before the banner. One listener on 0.0.0.0 serves both. Each end decides from the address independently, so there is no offer on the wire for an attacker to strip and no plaintext fallback to force.

The certificate is self-signed and the client pins it by SHA-256 fingerprint — no CA chain, which is the right answer for a machine no public CA would ever issue for. The fingerprint is shown at the bottom of the F9 panel; read it there and enter it in the client. A client with no pin stored refuses to connect rather than trusting whatever it is handed.

A password is compulsory off loopback — the listener refuses to start without one. It never crosses the wire: the server stores a PBKDF2-HMAC-SHA256 digest (210,000 iterations) and the client answers an HMAC over a fresh per-connection nonce, so every guess costs the guesser a full derivation and the server one HMAC. Failures escalate rather than banning outright — five from one address within ten minutes block it for fifteen minutes, and only five more earn a permanent entry in qivRemoteServerBlacklist.ini. The temporary block lives in memory only, so restarting qIV lifts it: mistyping your own password on a phone should not need a file edited to undo. Each failure is answered a second late, and a peer that connects and then goes quiet is dropped after ten seconds.

AllowList and BlackList take addresses, never domain names — a rule is matched against the address a connection actually arrived from, so DNS never enters the access decision. An empty AllowList denies everyone, by design. Both lists accept:

Form Example Notes
everything *
text prefix 192.168.1.* compares characters — see the warning below
CIDR 192.168.0.0/24, 2001:db8::/32 either family, any prefix length
range 192.168.0.10-50 shorthand — the upper bound is the last octet
range, full 192.168.0.10-192.168.1.5 crosses octet boundaries
one host 192.168.0.5, 2001:db8::1 compared numerically, so IPv6 spelling does not matter

⚠ The star is a string prefix, not an octet boundary. 192.168.1.* is what it looks like, but 192.168.1* — no trailing dot — also matches 192.168.10.x and 192.168.100.x, and 1* matches most of the internet. Use /24 when the boundary matters. Entries that could never match an address are dropped when you save, and the panel names what it dropped.

File-altering commands — delete, move, paste, save — are structurally unreachable over the wire: a compile-time assertion proves none of them has a row in the command table, and the executor refuses them again at run time.

Exposing it to the internet. Authentication is the only boundary — behind it, a peer can do what someone sitting at the viewer can, including opening a local path and pulling the displayed image back. The AllowList is address-based, so a client on a dynamic IP pushes you toward * and leaves the password as the sole gate. Prefer a VPN (WireGuard, Tailscale) over port-forwarding: every protection above still applies, the AllowList becomes meaningful again with stable addresses, and the listener stops being reachable by anyone who scans the port.

qIV Remote — the Android app

Your phone becomes the viewer's remote, a second screen, and a photo frame your PC drives.

Every feature of the app, screen by screen → — the four screens, the swipe gestures, finding a picture by typing part of its name, and what is in the free edition.

Point it at your PC over your own network and drive qIV from the sofa, the far side of a meeting room, or anywhere the keyboard is not. It is a real client of the protocol above, not screen sharing: it speaks the same verbs netcat does, so it stays in step with the desktop instead of streaming pixels at it.

It collects nothing. No accounts, no analytics, no advertising, and nothing sent to the developer — pictures and commands travel only between your phone and the server you point it at. Read the privacy policy.

Photos travel both ways

This is the part a remote control usually cannot do at all.

Direction What travels Why it is built that way
Desktop → phone
live preview
The current picture, scaled and re-encoded as JPEG before it leaves the PC 25–40× fewer bytes than the original, and a far smaller decode on the phone
Desktop → phone
Save
The original file, byte for byte, into Pictures/qIVRemote in your gallery Save asks for the original separately rather than keeping the preview — a re-encoded JPEG is not the file you meant to keep
Phone → desktop
push
Your photo's own bytes, base64 in chunks Works to a PC that has never seen the photo and cannot read your phone's storage

A pushed photo appears on the desktop once, over whatever is up. It changes no folder, no sort order, no playlist position, and a running slideshow keeps running with it occupying a single slide. Nothing has to be paused first, and nothing is left behind.

Saving to the gallery needs no storage permission — the app publishes through MediaStore, and the entry stays invisible until the transfer finishes, so a gallery scanning mid-transfer can never show you a half-written thumbnail.

Turn any spare screen into a photo frame

The same connection runs the other way round. Instead of using the phone to drive the PC, put it on a stand and let the PC drive it.

Open the Watch screen and the device shows whatever the viewer is showing — nothing else. No toolbar, no buttons, no chrome. Start a slideshow on the PC and the tablet on the shelf follows it, picture for picture, for as long as you leave it there.

An old tablet becomes a photo frame The one in a drawer with a cracked case is a perfectly good display. Prop it up, point it at the PC, start a slideshow.
A phone becomes a second screen for photos Cull on the big screen, review at arm's length, hand it to someone across the table.
The PC stays the library Your folders, your sort order, your filters, your drives. The screen is a window onto the machine that already has all of it.

It keeps up without being asked. The viewer announces every picture change — including the ones a slideshow makes on its own, where no key was pressed and no command was sent — and the screen fetches the new image the moment it hears. Nothing polls, nothing lags a frame behind.

It sends nothing back. The Watch screen has no Next, no Previous and no toolbar, and that is deliberate rather than unfinished: a control that could nudge a running presentation from a phone in somebody's pocket is a hazard, not a feature. It asks for two read-only things and nothing else. Tap anywhere to leave.

What crosses the network is a preview — scaled to that screen's size and re-encoded as JPEG on the PC before it is sent, not the original file. A 6 MB photo shown on a tablet moves as a few hundred kilobytes. That is what makes it comfortable over Wi-Fi, and what keeps a frame refreshing all evening from being a bandwidth decision.

As many screens as you have devices. Every connected device watches independently, so one PC can feed the tablet in the kitchen, the phone in the hallway and the spare monitor on the desk at the same time — all following the same library, all updating together. There is no per-screen licence, because there is nobody to license it from.

That also makes it signage and advertising that costs nothing to run: a shop window, a waiting room, a menu board, a studio wall. One PC you already own, screens you already have, your own network. No subscription, no cloud account, no per-display fee, and no service that can raise its price or shut down and take the wall with it.

And it runs unattended, which is the part that decides whether a display is a product or a chore. The viewer already has every piece:

Starts with the machine -runOnStartup, or the tray toggle. Power comes back after a cut and the wall comes back with it — nobody drives to the shop to click anything.
Ignores everybody Kiosk lock (-lock) makes the screen ignore every key and every click, so a passer-by cannot pause your loop or open a panel. The tray is the only way back in.
Stays awake Keep display awake blocks the screensaver and display sleep, and releases the hold the moment the window hides — a viewer sitting in the tray never keeps a machine up.
Loops by itself Slideshow with interval, loop and shuffle, and 21 GPU transitions. Point it at a folder and drop new artwork in — no playlist to rebuild, no re-upload, no publish step.

Changing what a wall shows is copying a file into a folder. That is the whole workflow.

No cloud account, no subscription, no photos uploaded anywhere. The pictures go from your PC to your screen across your own network, and stop there.

What else it does

Drive the viewer. Next / previous, first / last. Slideshow with its interval, pause, loop and shuffle. Zoom, rotate, flip. All five view modes. Colour effects. Fullscreen, always-on-top, panels and the on-image overlay.

Jump anywhere. The viewer's folder history comes down to the phone — tap a folder and the desktop goes there.

Presentation mode. The current picture and two large next/previous buttons, sized to press without looking. Built for talking to a room rather than staring at a phone.

Follow the desktop. Bind the connection and the preview keeps itself up to date — when someone changes the picture at the PC, your phone shows it.

As many PCs as you like. Each saved machine keeps its own address, port and optional password. Tap one to connect.

Demo mode. Every screen runs against a viewer that does not exist, so you can see the whole app before installing anything or opening a port.

A private network, and nothing else

The app talks only to the computer whose address you type. There is no account, no cloud, no analytics, no advertising, and nothing is ever sent to the developer — there is no back end to send it to.

When your PC requires a password it is verified by challenge–response, so the password itself never crosses the network. Off the loopback the connection is TLS with a pinned certificate, and qIV's own AllowList (F9) still decides who may connect at all. Passwords you choose to save stay in app-private storage on the phone.

Requirements. It is a companion app and does nothing on its own — the same way a TV remote does nothing without the TV. You need QuickImageViewer running on a Windows PC with its Local Server enabled (F9), and the phone on the same network. The app's About screen walks through the setup.

Get qIV Remote on Google Play

Command-Line & Kiosk Mode

qIV supports extensive CLI arguments for automation, digital signage, slideshows and locked-down kiosk environments.

QuickImageViewer.exe [image_path] [options]
Argument Description
"path\to\image.jpg" Open this image at startup and browse its folder
-startFolder <path> Open this folder as the browse / slideshow source
-background Start hidden in the system tray (service mode)
-fullscreen Start in fullscreen
-windowedView Start windowed (explicit override)
-alwaysOnTop Keep window above all others from launch
-monitorNum#N Open centered on monitor N (1-based, e.g. -monitorNum#2)
-slideshow Auto-start slideshow after content loads
-slideshowInterval N Seconds between slides (e.g. -slideshowInterval 8)
-repeat Loop the slideshow when it reaches the end
-shuffle Play slideshow in random order
-slideshowTransition=<type> Transition by name — 21 available (Fade, Iris, SlideLeft, ZoomIn, Spin, …)
-slideshowTransitions=<list> Custom set, by name or by the numbers shown in the menu (Fade,Iris,Spin or 6,8,1)
-slideshowTransitionSource=<none|all|list> Which transitions are in play
-slideshowTransitionOrder=<sequential|random> How the next one is drawn from that set
-slideshowTransitionShuffle Pick a random transition per slide
-hideMouse Hide the mouse cursor at startup
-lock KIOSK mode — all keyboard and mouse input is ignored; unlock from the tray
-keepDisplayAwake Block the screensaver and display sleep while the window is on screen
-dedicated Run as a dedicated screen — no registry writes, no history, own icon, mutex and window class
-config <path> Use this .ini instead of the one named after the exe
-instance=<name> Name this instance — settings, lists, mutex and window class derive from it
-instanceDesc=<text> Free-text description, shown on the generated shortcut
-promoOrder=<sequential|weighted> How the next promotion is chosen
-promoEveryImages=<from>-<to> Promotion every N images — 0 off, 5-0 exact, 5-15 random
-promoEverySeconds=<from>-<to> Same, counted in seconds — independent of the image counter
-RestoreDefaults Wipe all saved settings from the registry, show a confirmation dialog, and exit — recovery fallback if the app misbehaves after a config change
-runOnStartup Write / refresh the Windows startup registry entry so QIV launches automatically with Windows — equivalent to "Run on startup" in the tray menu. Dedicated instances write their own separate entry

Kiosk example:

QuickImageViewer.exe -dedicated -lock -fullscreen -slideshow -shuffle -slideshowInterval 8 -startFolder "D:\Ads"

A dedicated screen — the form the F8 panel writes into a startup shortcut. Folders and every setting come from the .ini and its .qim / .qpr lists:

qIV_dedicated_Lobby.exe -dedicated -config "D:\Screens\qIV_dedicated_Lobby.ini"

Runs an isolated instance, loops a shuffled slideshow every 8 seconds, and ignores all user mouse/keyboard input — ideal for unattended public displays.

How qIV Compares to Other Windows Image Viewers

Searching for the best free image viewer for Windows 10 or 11? Here is how QuickImageViewer stacks up against the most common alternatives.

Feature qIV Windows Photos IrfanView
Speed & footprint
GPU VRAM bitmap cache ✅ Direct2D
Instant image switching ✅ pre-decoded neighbours ⚠️ visible load delay ⚠️ visible load delay
Portable — no installer ✅ sub-10 MB single EXE ❌ UWP / Store
No background services ✅ process exits cleanly ❌ always-on UWP runtime
Formats
HEIC / AVIF / JPEG XL ✅ native + codec ⚠️ plugin required
SVG / OpenEXR / HDR ✅ built-in ⚠️ plugin required
Batch convert & rename
Plugin ecosystem ❌ codecs built in instead
Viewing & editing
Non-destructive GPU effects ✅ full D2D effect graph ⚠️ basic adjustments ⚠️ CPU, applied to the buffer
Crop / paint / resize editing ❌ effects only, Ctrl+S bakes
Configurable info overlays ✅ 9 independent slots ⚠️ slideshow captions
Slideshow transitions ✅ 21, GPU ⚠️ basic
Floating thumbnail panels ✅ up to 6 simultaneous ⚠️ separate browser window
Thumbnail strips as file manager ✅ drag between folders, shell ops ⚠️ in the browser window
Offline GPS geocoding ✅ embedded, zero network
Remote & multi-screen
Built-in remote control server ✅ every copy is a server and a client — it can be driven, and it can drive others
Android companion app qIV Remote — control, live preview, photo frame. Free for one desktop on the Simple remote, no ads ever; one-time unlock (~USD 2) adds unlimited desktops, Advanced + Fullscreen, streaming and save-to-gallery. Demo mode runs it all with no desktop at all
Phone ↔ desktop photo transfer ✅ both ways, originals not re-encodes
Drive other copies over TCP ✅ plain-text protocol, self-describing
Mirror one screen to many ✅ F11, per-target selection
Send an image across machines Alt+Enter, file bytes on the wire
Scriptable from anything netcat, shell, home automation ⚠️ local command line only
Kiosk / locked display mode ✅ CLI flag, ignores every key and click ⚠️ limited
Starts with Windows, unattended -runOnStartup + kiosk + keep-awake ⚠️ manual
Digital signage / ad loop ✅ folder in, wall out — no publish step ⚠️ slideshow only
Phones, tablets & TVs as extra screens ✅ as many as you own, no per-screen fee
Trust
No telemetry / tracking ✅ zero ❌ Microsoft telemetry
No ads ❌ promoted content
Open source ✅ AGPLv3
Per-monitor DPI V2 ⚠️ partial

✅ built in · ⚠️ partial, or needs a plugin or a separate window · ❌ not available. IrfanView wins the rows it wins — batch work and real editing are what it is for, and qIV does not try to replace them.

Frequently Asked Questions

Can qIV control another PC's image viewer, or a screen in another room?

Yes. Each copy can run a small TCP listener (F9) and any other copy can drive it (F10). F11 mirrors what you do to every selected screen; Ctrl+F10 sends a single typed command to whichever instances you tick. Because the protocol is plain UTF-8 text and describes itself — send help and it lists every command with its description — a script, netcat, a home-automation system or a phone app can drive it just as well. Sending one picture to a screen on a different machine works too: Alt+Enter streams the image's own bytes, so nothing depends on the far end being able to read your disk. See Remote Control & Mirroring.

qIV crashed. What do I do?

qIV writes a crash report next to its own executable, named QuickImageViewer_crash_<date>_<time>_<pid>.dmp, and tells you where it put it.

Nothing is sent anywhere. qIV has no telemetry and makes no network call of its own, so that file is written to your disk and stays there. Attaching it to an issue is entirely your choice — but it is the difference between a bug that gets fixed and one that stays a mystery, because it records the exact point the program failed.

The file contains a snapshot of qIV's internal state, including open file paths and window titles. It does not contain your images. If a path in it is sensitive, describe the problem in the issue rather than attaching the file.

Is QuickImageViewer free?

Yes. QuickImageViewer for Windows is completely free and open source under the AGPLv3 license — no ads, no telemetry, and nothing held back for a paid tier. The desktop never asks for anything.

The optional Android companion, qIV Remote, is listed free and stays usable free: one saved desktop, the Simple remote, and every security feature included. No ads at all, free or paid — the same “no account, no cloud, no analytics, no advertising” rule the desktop follows.

A single one-time unlock (about USD 2 — no subscription, no account) adds unlimited saved desktops, the Advanced and Fullscreen screens, phone-to-desktop streaming and save-to-gallery. Not sure? The built-in demo mode runs the whole app with no desktop at all, and never opens a network socket.

Can it open HEIC, AVIF and JPEG XL files on Windows?

Yes. AVIF works natively on Windows 11, JPEG XL on Windows 11 24H2+, and HEIC/HEIF via the free Microsoft HEIF Extensions from the Microsoft Store. WebP, SVG, OpenEXR, Radiance HDR, JPEG 2000, QOI and all classic formats are supported too — 44 file extensions in total, across more than twenty formats.

Does it need to be installed?

No. It is a single portable 9.7 MB executable — download and run. No installer, no registry pollution, no background services.

Why is it so fast?

Native C++23 on the raw Win32 API with Direct2D GPU rendering. Decoded images live in a VRAM cache, neighbours are pre-decoded on background threads, and the process can stay resident in the tray for instant recall.

Can it manage files — copy, move or delete images?

Yes. Directory thumbnail strips support drag & drop between folders (move, or Ctrl+drag to copy) plus right-click Copy, Cut, Paste and Delete with full Windows clipboard and Recycle Bin integration.

Can QuickImageViewer open RAW camera files?

QuickImageViewer uses the Windows Imaging Component (WIC) for decoding. If you install the appropriate Windows Camera Codec Pack or a manufacturer codec (Canon, Nikon, Sony, etc.), WIC will decode those RAW files and qIV will open them automatically — no extra configuration needed.

How do I set QuickImageViewer as my default image viewer?

Right-click any image file in Windows Explorer, choose Open with → Choose another app, browse to QuickImageViewer.exe and tick Always use this app. You can also set defaults per file type in Windows Settings → Apps → Default apps.

Does QuickImageViewer use a lot of memory or CPU?

No. Working set is typically under 100 MB when browsing standard JPEG folders. Decoded images are cached in VRAM (GPU memory) rather than system RAM. Background decode threads run at below-normal CPU priority so they never compete with foreground work.

Is QuickImageViewer available for Mac or Linux?

No. qIV is a native Windows application built on Direct2D, D3D11, Win32 APIs and the Windows Imaging Component — technologies specific to Windows 10 and 11. There are no plans for a Mac or Linux port.

Found a bug? Want something added?

Small requests count — a missing keyboard shortcut is as valid a request as a whole panel. The forms ask for a few details up front, because "it crashed" and "it crashed opening a 400 MB TIFF from a network drive" are different amounts of work to act on.

Report a bug Request a feature

Issues for the Android app belong here too

qIV Remote is developed separately, but its issues live alongside the viewer it talks to — almost every question about one involves the other. There is a form for it, and it starts with the three things that cause nearly every connection problem: Local Server switched off, the phone missing from the AllowList, or the two devices being on different networks.

Security issues get a private channel. qIV can listen on a network port, so anything touching authentication, TLS or the AllowList belongs in a security advisory rather than a public issue.

If it crashed, there is a .dmp file next to QuickImageViewer.exe. Attaching it turns a mystery into a stack trace. It holds open file paths and window titles — not the contents of your images — and nothing is ever sent anywhere on its own.

Architecture & Building

  • Renderer — Direct2D + D3D11 with GPU bitmap cache. GDI software fallback. Full ID2D1Effect graph for color operations.
  • Decoding — WIC pipeline for OS-native formats. Custom decoders for EXR, HDR, PNM, QOI. SVG via resvg on a background IO thread.
  • Threading — Worker thread pool for background decode and preload. Atomic indices prevent stale frames; window messages synchronize back to the UI thread.
  • Caching — GPU bitmap cache with configurable size, preloading adjacent images in both directions. Live cache inspector panel.
  • DPI — Per-monitor DPI aware V2; pixel-perfect on 4K and mixed-DPI setups.
  • Persistence — Registry-backed settings, folder history manager, favorites system.

Third-Party Libraries

Library Purpose
resvg SVG rasterizer (Rust static lib)
OpenJPEG JPEG 2000 decoder
tinyexr OpenEXR decoder
miniz zlib compression for embedded GeoNames data

Building from Source

Written in C++23. Requires CMake and MSVC (Visual Studio 2022 or CLion).

git clone https://github.com/icyhoty2k/QuickImageViewer.git
cd QuickImageViewer
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release

For offline geocoding, generate the GeoNames binary resources before building — download cities1000.txt, admin1CodesASCII.txt, admin2Codes.txt and countryInfo.txt from geonames.org into resources/geoData/, then run python tools/preprocess_cities.py.