pho: an image viewer

# pho: View and annotate multiple images

...Akkana

pho (pronounced like the first syllable in "photo") is a lightweight program for viewing large numbers of images quickly, rotating or deleting some, and making notes about what to do with each image -- for instance, for going through hundreds of images after uploading them from a digital camera.

The current version is pho 0.9.8.
To get it, skip to the download section.

The big change here is Keywords mode. It uses the same note flags that Pho has always had, but Keywords mode gives you an easy way to annotate a directory of images with strings. You can type in phrases for each note, and you can have up to 31 notes now, not just 10. If you use Pho to categorize your photos, you'll find Keywords mode very handy.

In Keywords mode you can also type in a unique image comment for each image. Comments aren't tied to the numbered image flags -- each image has its own comment.

There's also a new slideshow mode, where you specify the interval in seconds (e.g. pho -p -s5 for a 5-second delay between images). You can use this for a screensaver, or just to go through slides automatically. Hitting the spacebar cancels slideshow mode.

You can now customize the command called up with the 'g' key. It defaults to gimp (not gimp-remote as in previous pho versions), but you can call any program you like, e.g. view the current image in firefox with `export PHO_CMD="firefox %s"` -- don't forget the %s for the filename!

BSD users: pho should build on *BSD now as of 0.9.6-pre2. If it doesn't, please let me know.

Other changes include major work on scaling modes. Double and half size mode now behave differently depending on whether you're in normal or full size mode, and the scaling factor (e.g. half size) is remembered as you go from image to image.

Warning: I've swapped the meanings of f and F. I found that I use full size mode all the time, whereas I seldom use full screen, and when I do, I use it once at the beginning of a session (e.g. to view a bunch of cartoons scaled up). So it makes more sense to have full size on f (easier to type).

I've also done quite a bit of performance work, to reduce the number of redraws, speed up rotates, and reduce the number of times Pho has to re-read the file on disk.

Skip to the download section.

## Why another image viewer? Surely there are plenty of those?

I used to use xv for paging through images -- it's quite a good viewing program -- but it had a few features which annoyed me. For example, it creates a directory called .xvpics in every directory it touches; and if an image has to be resized to fit the screen, and after that you save it (perhaps after rotating it), it saves at the smaller size and boom, there goes your high-res image.

But, more important, there were a few extra things I needed. During image triage, I need to be able to do a few things quickly:

- Rotate images by multiples of 90 degrees, and remember the rotations.
- Delete bad images.
- Copy a few of the best horizontals to my Backgrounds (wallpaper) directory.
- Note which images I might want to put on a web page (after resizing).

With xv, I found that I was writing these lists on paper, or trying to keep track of them in my head. That's dumb! Why not make the computer do that work? So I did.

Since I wrote pho several years ago, I keep hearing about other image viewers, and thinking maybe pho was redundant. But I recently did a search, and couldn't come up with any other image viewers that are similarly efficient for paging through large collections of images. So I guess I'll keep maintaining pho!

Pho can read any format supported by gdk-pixbuf. I haven't found a list of those formats anywhere, but it seems to be substantial. The only format I've hit so far that it doesn't read is photocd. You can convert those to other formats using the ImageMagick utility.

Pho can delete images on disk, but it can't save rotated images yet. I use my imagebatch scripts for that, or you can use a commandline utility like ImageMagick (which is what my imagebatch scripts use under the hood).

## How to use pho

Usage: pho *.jpg (or whatever).
It will show the first image, scaled for your screen if needed. Then the following keys work:

space
  Go to next image.
backspace, -
  Go to previous image.
r, t, right-arrow
  Rotate right (clockwise).
R, T, l, L, left-arrow
  Rotate left (counter-clockwise).
up-arrow
  Rotate 180 degrees.
home
  Go back to the first image.
d
  Bring up a delete dialog (another d deletes the file)
i
  Show information about the image (includes EXIF info and JPEG comment, if any).
0-9
  Add this image to the appropriate list.
f
  Toggle in and out of "full size mode" (show the image at its native size, even if that's too big to fit on screen)
F
  Toggle in and out of "full screen mode" (make the image as big as it can be and still fit on the screen).
p
  Toggle in and out of Presentation Mode (full screen, no mouse or window borders)
-, /
  Zoom out, to half size
+, =, *
  Zoom in, to double size o
  Pop up a file selector to change the working file list (New replaces all the old images, Add just adds new files to the list)
g
  Run gimp on this image (or set PHO_REMOTE to an alternate command).
q
  Quit.

pho will remember the correct (last shown) rotation for each image. When it exits (either because the last image was viewed or because the user typed q), it will print out the images that need to be rotated and deleted (it does not actually change the files on disk), and the images which were added to numbered lists. For example, I might press 1 on all the photos I want to save for a web page, 2 on the couple of photos that need additional editing in gimp, and 3 on the photos I want to save as desktop backgrounds.

## Download: Getting pho

Current version: pho-0.9.8.tar.gz. (source tarball).

Latest source tree: Pho is now hosted on Github, and you can get the latest source tree there, as well as file bugs or otherwise participate.

There's also an old Google Code repository but it's gotten out of date -- I recommend you not use it.

Debian/Ubuntu packages for 0.9.8:

Ubuntu 12.04 Precise Pangolin
  pho_0.9.8-0ubuntu0~12.04_i386.deb
Debian Squeeze
  pho_0.9.8-squeeze_i386.deb
Source packages
  pho_0.9.8.dsc
  pho_0.9.8.tar.gz
  pho_0.9.8_i386.changes

I will get the Ubuntu packages onto Launchpad soon, I hope.

Ancient Windows binary (requires gtk+): pho-0.9.5-pre5.zip. (Thanks to Michael Schumacher!)

Mac users: Pho definitely does work on Mac OS X if you have the appropriate gtk/gdk headers and libraries (my husband uses it). I've only seen it used as an X11 application, but in theory it should be able to run with the new experimental native gtk libraries too.

### Dependencies:

pho uses the gtk+-2.0 libraries (though if it can't find them, it can run slightly less functionally with gtk1 and gdk-pixbuf). You may need to edit the Makefile if your system has these libraries installed in different place from my system (sorry, no autoconf yet).

To compile pho, you'll need a compiler, GTK, and all the libraries it depends on. For example, on Ubuntu, this command should get you what you need:

    aptitude install build-essential libgtk2.0-dev

If you like pho, or if you think it's promising but there's some feature it really needs ... let me know!

## Changelog

4/10/2012, Pho 0.9.7-pre8:
  Add captions/image comments (from David ) with -c. Improve scaling up from keywords mode (but some scaling issues remain). More aspect ratio fixing and code cleanup.
4/17/2011, Pho 0.9.7-pre7:
  Fix aspect ratio of fullsize mode on vertical images; increase keyword dialog height, and add some keyword dialog reliability fixes; fix build warnings reported on Irix.
11/26/2010, Pho 0.9.7-pre6:
  Much more reliable scaling code -- this (I hope) fixes the problems with aspect ratio upon rotation. New PHO_SCALE_FIXED mode: keep image's larger dimension <= the given size. Use PHO_SCALE_FIXED and .75 times the shorter dimension of the screen for Keywords mode. Alt+num toggles 10+num flag.
4/10/2010, Pho 0.9.7-pre5:
  Fix a slew of subtle bugs involving going back and forward in the image list (e.g. when specifying nonexistent images). Add some information on how to test for regressions.
2/9/2009, Pho 0.9.7-pre4:
  Fix a race condition involving the keywords dialog getting focus.
12/15/2009, Pho 0.9.7-pre3:
  More cleanup of rotation/scaling, and transitions from one mode to the next.
9/26/2009, Pho 0.9.7-pre2:
  Add ability to add new image files or change the list without restarting. Total cleanup/rewrite of rotate/scale logic. Remove old gtk1 code.
??/??/2009, Pho 0.9.7-pre1:
  Clean up rotation code; List images with incorrect exif rotation; smarter PHO_REMOTE (can do other things, not just GIMP); don't go fullscreen from Ctrl-F in the keywords dialog. fix a minor Mac build issue.
11/9/2008, Pho 0.9.6:
  RELEASE! The only difference from 0.9.6-pre3 is to change the default PHO_REMOTE command from gimp-remote to gimp, since gimp-remote is obsolete and no longer provided in Linux distros (and never was, on Mac or Win).
10/2/2008, Pho 0.9.6-pre3:
  Change the list next/prev code to fix (I hope) a bug where pho would get confused and cycle from the last image back to the first.
8/13/2008, Pho 0.9.6-pre2:
  Simplify exif/Makefile so it'll work on FreeBSD and other systems where make is non-GNU make.
8/11/2008, Pho 0.9.6-pre1:
  Add Keyword mode. Add slideshow mode. Swap -f and -F. Add PHO_REMOTE environment variable. Lots of performance and stability work.
8/6/2007, Pho 0.9.5.1:
  Fix a buffer overflow bug on the 'g' key, which runs gimp-remote on the current file.
3/20/2007, Pho 0.9.5:
  No changes except some manual and html page updates.
3/5/2007, Pho 0.9.5-pre5:
  Check for a PHO_ARGS environment variable. Add a -P argument to force non-presentation mode. Fix a few bugs with double/half size and with scaling.
  Make note 0 work properly.
7/24/2005, Pho 0.9.5-pre4:
  Double and half size weren't working properly;
  couldn't use arrow and spacebar to get out of the final Quit confirmation dialog (though ESC always worked).
10/9/2004, Pho 0.9.5-pre3:
  Fixed a crash bug when revisiting an image which was previously rotated.
  Added a workaround for Metacity's evil window size handling.
  Made the background black when in presentation mode.
9/30/2004, Pho 0.9.5-pre2:
  Fixed some bugs involving ending up at the wrong image when deleting or pressing HOME. Cleaned up handing of image list.
  Fixed an aspect ratio problem.
7/13/2004, Pho 0.9.5-pre1:
  Rewrote the image list handling to use a linked list. Lots of associated code cleanup.
  Port to gtk2, and build under either gtk1 or gtk2.
  Add new "fullscreen mode" (e.g. for presentations, or for difficult window managers).
  Various futile attempts to hang on to window focus in various window managers.
9/30/2003, Pho 0.9.2:
  Don't try to move the window unless the image size has changed (fix the annoying bug where pho wouldn't let you move windows).
  Also fix a crash after dismissing the info dialog by clicking on the windowmanager "X".
2/26/2003, Pho 0.9.1:
  Rusty Russell: fix an off-by-one error in rotation code, reducing the need for extra memory;
  Brian Langenberger: bracket printed filenames with quotes if they contain spaces or quote characters.
1/8/2003, Pho 0.9:
  Fix pho.spec version, and a make clean bug.
12/3/2002, Pho 0.9pre2:
  Fix a crash in the quit dialog.
11/27/2002, Pho 0.9pre1:
  Add EXIF handling, using code from jhead, by Matthias Wandel.
10/18/2002, Pho 0.8:
  Build RPM and deb; show image size in titlebar; add home key.
8/13/2002, Pho 0.7:
  Put image name in titlebar; prompt after last image before quitting; add fullscreen mode.
7/28/2002, Pho 0.6.1:
  Fixed a bug with printing a note set on the last image.
7/21/2002, Pho 0.6:
  Code cleanup, change the handling of the notes structures.
7/21/2002, Pho 0.5.1:
  Fix a bug where image rotations were wrong when going backward.
7/11/2002, Pho 0.5:
  Add delete dialog, and really delete files on disk.
7/3/2002, Pho 0.4:
  Fixed a bug with gif rotation.
7/1/2002, Pho 0.3:
  Rename yass to pho, add info dialog.
6/28/2002, Yass 0.2
  Some added features; add manual and make install target.
6/24/2002, Yass 0.1:
  First release.

Akkana's Software
Shallowsky Home