Lew's Picture Viewer

Lew's Picture Viewer (Lpv.NET) is a simple image viewer developed as an exercise to learn C# and WPF (Windows Presentation Framework, part of .NET framework). The executable is available here in a version based on .NET 4.0 (and here in a version based on .NET 3.5 -- should track previous except does not support shortcuts). If you want to try it, just download the executable. No install to be done.

The same application is also available under Python. The Python version is very similar in layout and features to the C#/WPF version. Main differences and other notes at the bottom. Available as python script (see below) and as a self-contained MacOS app (unzip it and move LpvWx.App directory to your ~/Applications directory).

For a quick overview, I have a short video (10 minutes) introducing the main features. Bad audio unfortunately.

Both versions are now essentially completed. Some functions may seem like unnecessary features, but were done to explore some area, such as the slide show to explore timers. Other areas might still not be quite optimal, such as GUI focus management.

It has features which may be useful to a photographer, such as viewing some or all images in B&W. Something I haven't seen in any other viewer (altho I'm sure there are some, no need to send me a list).

Some of the main characteristics compared to other viewers I've used:

Of course, the extensions (eg .jpg) of image files can be associated with this viewer, and such images can then be opened on double-clicking.

The set of images is organized in a ring (circular buffer), with an blank "wrap point" (the "Home" button) between the last image and the first image. The initial order is that of the command line parameters. Thereafter, the set can be sorted by date, simple name, and a few more. Images added after initial load are added after the current image, or after the last one if no current image (ie. on the wrap point).

Lpv.NET understands usual image file types supported by WPF: JPEG, PNG, TIFF, &c, as well as shortcuts.

Lpv.NET also understands text files containing names of image files (and even HTTP URLs). For example, the following text file would open four images:

  Notes=Some text that describes image
Lines that that don't start with a space or a # (comment) are paths to images. File names are either absolute (first two above) or relative (third); in latter case, the names are relative to the directory of the text file, not the directory in which the application is started. Supported extension for text file is .lpv (.txt no longer supported). Ideally, the .lpv would be associated with the application.

The .lpv text file can also contain notes and/or markings, as shown above.

When walking a directory, only images are considered, no recursion deeper into sub-directories or text files. It would be possible, but there is the risk of opening (much) more than wanted. Recursion is done from text files (so a text file could contain names of directories or other text files) -- be careful (esp. of loops! no checking).



File   Saving notes, loading new images, &tc
File -> Save Notes   Save list of images and associated notes
File -> Save Notes As...  Save list of images and associated notes
File -> Load...   Load new images (can select multiple files)
File -> Load URL...   Load image from URL
File -> Load Test Image   Load test image from http://www.photofriday.com/calibrate.php
File -> Clear Set   Clear image set
File -> Exit   Exit Lpv.NET
Set   Actions on image set
Set -> Sort Name   Sort image set based on image name
Set -> Sort Date   Sort image set based on file date (using EXIF date would be confusing, as not all images have that date)
Set -> Sort Flags   Sort image set based on the two marks: "marked" images come first, then unmarked images, then "deletable" images
Set -> Sort Notes   Sort image set based on notes
Set -> Sort Full Name   Sort image set based on full path name of image
Set -> Sort Size   Sort image set based on file size
Set -> Show All in Greyscale   Toggle view of all images as greyscale or color
Set -> Show All Upside Down   Toggle view of all images upside-down or normal
Set -> Show Over/underexposure   Show (or don't) areas of the image where we have clipped highlights / blocked shadows -- Tab key can also be used to toggle this
Set -> Show Deletable Images   Show (or don't) images marked for delete
Set -> Start Slide Show   Start or stop slide show (randomized)
Image   Actions on a single image
Image -> Copy Info   Copy some info (including full path) on current image to clipboard
Image -> Copy Bitmap   Copy original image bitmap to clipboard
Image -> View Metadata   View image metadata (if available)
Image -> Edit   Launch program to edit image (see below)
Help -> About   About information
Help -> Help   Show this page


Prev   Show previous image. With shift, show image from previous date (see details below).
Next   Show next image. With shift, show image from next date.
Home t   Position on "wrap point" on ring, after last image and before first.
Three rotate buttons   Three buttons to rotate image -- no change on disk of course. Lpv.NET will try to read the proper orientation when the image is loaded for the first time.
Grey/color   Toggle B&W and color for this image -- no change on disk.
(two sliders)   Two sliders to change curves -- no change on disk. The first is roughly brightness, the second, contrast. Work in progress.
Reset   Reset above two sliders to their center positions.
[Move] to end   Move current image to end of set, and show next image. Can be used as a crude manual sorting mechanism.
To position on end/begin of image set, use "Home" button.
Mark   Mark image (for whatever purpose). A green checkmark signals this. An image cannot be marked and deletable at the same time.
Deletable   Mark image to be deleted (deletable) -- no change on disk of course, but this flag will be in the output notes file (and the actual delete can be scripted from there). A red cross over the image signals this.
Note: if you make the window too small, some of these controls will disappear.


Left/right arrows   Outside "Notes" area, show previous/next image. With shift, show image from previous/next date (see notes below).
In "Notes" area, move within text. With shift, position on beginning/end of text.
Page up/down   Show previous/next image. Works whether in or outside of "Notes" area, useful when adding comments to many images in succession.
Up/down arrows   Outside "Notes" area: nothing for now.
In "Notes" area, recall recent notes (useful when many images get same/similar notes).
Enter   Switch focus to/from the "Notes" area. In some cases, you may need to use the mouse to switch focus to the "Notes" input area.
Backspace/del   Outside "Notes" area, toggle "mark for delete" of this image.
Tab   Outside "Notes" area, toggle "Show over/underexposure"


Other notes

Errors and other unusual circumstances

Some known challenges

Notes on the Python version

The source code and necessary images is available here (unzip contents in a folder, eg. ~/Lpv/). It needs Python and wxPython installations. Useful things to know: The Python version of the viewer is also available as a self-contained MacOS app. Useful things to know:

Closing remarks

If you have problems with this viewer, don't hesitate to write, I'll try to help.

If you have suggestions, I'll listen. But basically, the tool is mostly as I want it... Still, I might try to add thumbnails, and have more control over zooming.

Email:  (franšais, English, Deutsch).

If you wish to support this work, you can make donations via PayPal.