Skip to content

SysAdminDoc/Images

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

84 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Images — a Windows 7–style classic image viewer, reimagined in dark mode

Images

Version License Platform .NET

A Windows 7–style classic image viewer, reimagined in dark mode, with inline rename-while-viewing.


Why another image viewer?

Because sometimes you don't know what to call a photo until you actually see it — and the existing dark-mode viewers on Windows make you close the image, rename the file, and reopen. Images fixes that: the filename lives in a side panel right next to the photo. Type; the file is renamed 600 ms after you stop typing. Change your mind? Hit Undo in the Recent Renames list.

Features

  • Broad format coverage via WPF's built-in WIC plus Magick.NET: JPG, PNG/APNG, GIF, TIFF, WEBP, HEIC, AVIF, JXL, PSD/PSB, TGA, DDS, QOI, EXR, HDR, DPX, JPEG 2000, DICOM, FITS, XCF/ORA, SVG, WMF/EMF, WPG, RAW/DNG/NEF/CR2/CR3/ARW/RW2/RAF/ORF/PEF, legacy production formats, and more.
  • Document/vector previews for PDF, EPS, PS, and AI when Ghostscript is bundled app-local or installed on the machine. Images auto-detects Codecs\Ghostscript, IMAGES_GHOSTSCRIPT_DIR, and standard Ghostscript installs.
  • Multi-page navigation for documents and layered/page-based image formats. PDF, TIFF, PSD/PSB, ICO, DICOM, FITS, DCX, and related formats surface page/frame controls only when the current file has more than one page.
  • Animated GIFs play inline — multi-frame GIFs (and animated WebP / APNG when the Magick build supports them) decode via MagickImageCollection.Coalesce() and cycle through ZoomPanImage with the original per-frame delays + loop count intact. A green "N frames" chip in the bottom toolbar marks animated files.
  • Classic Windows 7 Photo Viewer layout — centered image, bottom toolbar, hover-reveal circular arrows on the left and right edges. But in Catppuccin Mocha dark.
  • Live inline rename — split stem + extension editor on the right. Extension is locked by default (no more accidentally renaming photo.jpgphoto.jp). Debounced auto-save; no Save button.
  • Conflict-safe — if a target name already exists in the folder, the rename preview shows exactly what it will become (name (2).jpg) before it commits.
  • Recent Renames panel — the last 10 renames are stacked on the side with Undo buttons.
  • Full directory navigation — open one photo, scroll through the whole folder with ← / → keys or the hover arrows. Wraps at the ends. Natural-sorted so IMG_2.jpg comes before IMG_10.jpg.
  • Togglable folder filmstrip — a compact, virtualized, cached thumbnail rail spans the current folder, keeps the current item centered, supports right-click Open/Reveal/Copy actions, and falls back to the side panel when hidden.
  • Photo metadata at a glance — the Details panel and optional I metadata HUD surface embedded EXIF date, camera, lens, exposure, focal length, and GPS coordinates when present, without opening a separate info window or sending location data anywhere.
  • Zoom + pan — mouse wheel to zoom in/out about the cursor, drag to pan, double-click to toggle fit/1:1.
  • Export a copy to JPEG, PNG, WebP, AVIF, JXL, TIFF, BMP, GIF/APNG, PSD/PSB, PDF/EPS/SVG, TGA, DDS, QOI, EXR, HDR, JPEG 2000, X11/Magick, production/scientific, and portable bitmap formats.
  • Rotate, delete-to-Recycle-Bin, Reveal in Explorer, Copy path.
  • No confirmation dialogs — actions happen immediately with toast feedback.

Install

Both artifacts ship alongside every release. They're the same build — pick whichever fits your workflow.

Installer (recommended for most users)

  1. Grab Images-vX.Y.Z-setup-win-x64.exe from Releases.
  2. Run it. Installs to %ProgramFiles%\Images by default (admin) or %LOCALAPPDATA%\Programs\Images if you choose per-user at the UAC prompt. No separate .NET runtime install is required.
  3. Optional boxes on the wizard: Desktop icon, Add to "Open with" menu (non-destructive — adds Images to the Windows "Open with" list without overriding whatever you currently have set as default for those extensions).
  4. Uninstalls cleanly from Settings → Apps → Installed apps.

The installer is self-contained: the .NET Desktop runtime and bundled codecs ship inside the app folder.

Portable (zero install)

  1. Grab Images-vX.Y.Z-win-x64.zip from Releases.
  2. Extract anywhere.
  3. Run Images.exe. Leaves no registry writes.

To associate file types from a portable install: right-click any image → Open withChoose another app → browse to Images.exe → tick Always use this app.

From source

git clone https://github.com/SysAdminDoc/Images.git
cd Images
dotnet build -c Release
dotnet run --project src/Images

Optional bundled Ghostscript

PDF, EPS, PS, and AI previews require Ghostscript. For a self-contained release experience, place the approved Ghostscript runtime under src/Images/Codecs/Ghostscript before publishing; the project copies that folder into the app output automatically. A typical layout is Codecs/Ghostscript/bin/gsdll64.dll with the matching Ghostscript support files beside bin; gswin64c.exe is optional and only used for version display.

Images also detects IMAGES_GHOSTSCRIPT_DIR and normal system installs under %ProgramFiles%\gs. Keep third-party binaries out of source control unless redistribution rights for the exact package are already approved.

Release builders can use scripts/Prepare-GhostscriptBundle.ps1; see docs/codec-bundling.md.

To build the installer locally, install Inno Setup 6, run dotnet publish src/Images -c Release -r win-x64 --self-contained true -p:PublishSingleFile=false -o publish, then iscc /DMyAppVersion=0.1.7 installer\Images.iss. Output lands at installer\output\Images-vX.Y.Z-setup-win-x64.exe.

Keyboard

Key Action
← / → Previous / next image in folder
Home / End First / last image
Space / Backspace Next / previous image
Delete Send current image to Recycle Bin
F5 Rescan current directory
I Toggle metadata HUD
Enter (in rename box) Commit rename now (skip debounce)
Esc (in rename box) Cancel edit, revert textbox to disk name
+ / - Zoom in / out
0 Fit to window
1 100% zoom

(Navigation keys are swallowed by the rename textbox while it has focus, so you can freely use arrow keys inside the filename editor.)

Architecture

src/Images/
├── App.xaml                    # Entry point, theme merge
├── MainWindow.xaml             # Layout: image canvas + side rename panel + bottom toolbar
├── ViewModels/
│   ├── ObservableObject.cs     # INotifyPropertyChanged base
│   ├── RelayCommand.cs         # ICommand impl
│   └── MainViewModel.cs        # All view state + commands
├── Services/
│   ├── ImageLoader.cs          # WIC-first, Magick.NET fallback, cached decoding
│   ├── ImageExportService.cs   # Codec-aware Save a copy / conversion output
│   ├── ImageMetadataService.cs # Read-only EXIF summary for the Details panel and HUD
│   ├── CodecCapabilityService.cs # About-window codec summary and copyable diagnostics
│   ├── SupportedImageFormats.cs # Central extension catalog for discovery/dialogs
│   ├── CodecRuntime.cs         # Optional app-local Ghostscript runtime discovery
│   ├── AppStorage.cs           # LocalAppData/Temp storage fallback for caches and logs
│   ├── DirectoryNavigator.cs   # Natural-sort folder scan, prev/next/wrap, FileSystemWatcher
│   ├── ThumbnailCache.cs       # Disposable WebP thumbnail cache for the folder preview strip
│   └── RenameService.cs        # Debounced File.Move, conflict resolution, undo history
├── Controls/
│   └── ZoomPanImage.cs         # Wheel-zoom + drag-pan image host
├── Themes/
│   └── DarkTheme.xaml          # Catppuccin Mocha tokens + control styles
└── Resources/                  # icon.ico (app icon), icon.svg (vector wrapper), logo.png

Diagnostics

Images carries its own diagnostics surface — no terminal required for the common cases:

  • About → Save system info writes the same content as Images.exe --system-info to a file in %TEMP% and reveals it in Explorer. Attach the file to a bug report.
  • About → Open data folder opens %LOCALAPPDATA%\Images\ so logs (Logs\images-<date>.log), crash records (crash.log, crash-*.dmp), settings (settings.db), and caches (thumbs/, update-check.json) are reachable in one click.
  • About → Codec report copies the per-format capability matrix and supported-extension list to the clipboard.
  • Images.exe --system-info and Images.exe --codec-report print the same content to stdout for support tickets and CI smoke tests.

Policies

  • Release support policy — what versions get servicing and for how long.
  • Codec support policy — bundled-vs-optional tiers and the gate every new optional decoder must pass.
  • Privacy policy — exactly one network call (the opt-out update check), every file persisted to disk, and a four-step verification recipe.

Credits / inspiration

Architectural inspiration taken from existing OSS viewers (no code copied, both are GPL-3):

  • ImageGlass — Windows-native decoding model, format breadth, toolbar ergonomics.
  • nomacs — side-panel information architecture, filename-edit UX.

License

MIT © SysAdminDoc

About

Dark-mode Windows 7 Classic Photo Viewer, with live inline rename-while-viewing. C# / .NET 9 / WPF.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors