Building a Photo Gallery
Posted: | 2009-05-05 14:31 |
---|---|
Tags: | Python |
Caution!
I'm not an expert in this area so take this with a pinch of salt!
Back in 2002 when I last had photos online I used a conversion script to create thumbnails. Today I need to handle videos as well as images. Back then I also maintained a database of all the photos and added my own metadata as well as data I extracted from the EXIF information. This time I want to keep all the data separate in text files so that it can easily be recreated.
All my photos and videos are in a directory called Photos and each sub-directory represents a DVD's worth of photos and videos in a series of un-structured sub-directories.
My approach for the gallery is as follows:
Scan the Photos directory for sub-directories
Create 6 new directory structures mirroring the structure of the Photos directory:
- stills
One frame stills of the each of the videos
- h264
Flash Player 9/10 compatible videos
- 1024
Photos resized to a maximum size of 1024x1024
- 150
Thumbnails 150x150 zoomed in on the centre of the photo to make a square and slightly sharpened
- exif
The EXIF/metadata extracted from each of the original files
- meta
Extra metadata I want to add to the photos or videos
Populate each of the new directories
Setting up ffmpeg
Caution!
Because lots of the vidoes I have are in proprietory formats, I need a series of proprietory codecs which means I have to compile ffmpeg from scratch and cannot share the binary with you. The best I can do is share the instuctions for how to compile it yourself on Ubuntu Intrepid so you can use it yourself - but you won't be licensed to distribute it either.
I don't know a great deal about video except that H264 offers excellent compression, verg high quality and can be played by recent versions of Flash player. As a result it is the video format of choice for the gallery.
I followed a combination of these two guides:
Neither guide quite worked for me but a combination did. In particular I needed the --enable-libamr-nb --enable-libtheora --enable-libvorbis --enable-libamr-wb flags Here are the exact commands I used (Ubuntu 8.10, 3rd May 2009):
sudo apt-get purge ffmpeg x264 libx264-dev sudo apt-get install build-essential subversion git-core \ checkinstall texi2html libfaac-dev libfaad-dev \ libmp3lame-dev libtheora-dev libxvidcore4-dev cd ~/ wget http://www.tortall.net/projects/yasm/releases/yasm-0.7.2.tar.gz tar xzvf yasm-0.7.2.tar.gz cd yasm-0.7.2 ./configure make sudo checkinstall --pkgname=yasm --default sudo dpkg -i yasm*.deb cd ~/ git clone git://git.videolan.org/x264.git cd x264 ./configure --enable-shared make sudo checkinstall --fstrans=no --install=yes --pkgname=x264 \ --pkgversion "1:0.svn`date +%Y%m%d`-0.0ubuntu1" --default sudo ldconfig sudo dpkg -i x264*.deb cd wget http://ftp.penguin.cz/pub/users/utx/amr/amrwb-7.0.0.3.tar.bz2 tar jxfv amrwb-7.0.0.3.tar.bz2 cd amrwb-7.0.0.3/ ./configure make sudo make install cd wget http://ftp.penguin.cz/pub/users/utx/amr/amrnb-7.0.0.2.tar.bz2 tar jxfv amrnb-7.0.0.2.tar.bz2 cd amrnb-7.0.0.2/ ./configure make sudo make install cd svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg cd ffmpeg ./configure --enable-gpl --enable-nonfree --enable-pthreads --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libtheora --enable-libx264 --enable-libxvid --enable-libamr-nb --enable-libamr-wb make sudo mkdir /usr/local/lib/pkgconfig sudo mkdir /usr/local/include/libavdevice sudo mkdir /usr/local/include/libavformat sudo mkdir /usr/local/include/libavcodec sudo mkdir /usr/local/include/libavutil sudo mkdir /usr/local/include/libswscale sudo mkdir /usr/local/share/ffmpeg sudo mkdir /usr/lib/vhook sudo checkinstall --fstrans=no --install=yes --pkgname=ffmpeg --pkgversion "3:0.svn`date +%Y%m%d`-12ubuntu3" --default sudo dpkg -i ffmpeg*.deb sudo ln -s /usr/local/lib/libamrnb.so.3 /usr/lib/libamrnb.so.3 sudo ln -s /usr/local/lib/libamrwb.so.3 /usr/lib/libamrwb.so.3
Creating the H264 Video
Here's the command I use to create the videos:
/usr/local/bin/ffmpeg -y -i ../Desktop/untitled\ folder/CIMG2750.AVI -pass 1 -vcodec libx264 -vpre fastfirstpass -b 512k -bt 512k -threads 0 -f mp4 -an /dev/null && /usr/local/bin/ffmpeg -i ../Desktop/untitled\ folder/CIMG2750.AVI -pass 2 -acodec libfaac -ab 128k -ac 2 -vcodec libx264 -vpre hq -b 512k -bt 512k -threads 0 -f mp4 ../Desktop/output.mp4
This compresses a 14Mb file down to 1.1Mb with no really noticable loss of quality (it was an underwater video anyway).
Extracting the EXIF Data from JPEGs
Install exiv2:
sudo apt-get install exiv2
Then extract data like this:
exiv2 pr Desktop/CIMG2745.JPG > exif.txt
Resizing an Image
Install ImageMagick and ufraw (for raw camera images)
sudo apt-get install imagemagick ufraw dcraw
You can do this fairly easily like this, only resizing images greater than 1024x1024 in either dimension.
convert -auto-orient -thumbnail 1024x1024> -unsharp 0x.5 input.JPG output.jpg
Creating a High Quality Thumbnail
I used to create a 100x100 thumbnail, scaled so that the whole photo is visible. This time I want to use 150x150 thumbnails but zoomed in a little so that the image fills the square. I've also found in the past that thumbnails can look a little blurry so I want to sharpen them up a bit. We can also strip the EXIF data from the thumbnails (the -thumbnail option does this anyway.
Run the command:
convert -auto-orient -thumbnail x150 -crop 150x150+0+0 +repage -gravity center -unsharp 0x.5 input.JPG thumb.jpg
See also:
Generating Stills
This is the command I use to create a thumbnail from CIMG2750.AVI. Notice the -ss 00:00:08.5 part. This says to take the still from 8.5 seconds into the video:
ffmpeg -i CIMG2750.AVI -an -ss 00:00:08.5 -an -r 1 -vframes 1 -y thumb.jpg
The full size stills go in the stills directory but also need to be resized to go in the thumbnails directory.
Overlaying a Video Icon
I like to overlay a video icon on the video thumbnails so it is clear what they are. Here's one I made (transparent PNG):
wget http://jimmyg.org/blog/2009/building_a_gallery/video.png
Here's how to use it:
convert -auto-orient -thumbnail x150 -crop 150x150+0+0 +repage -gravity center -unsharp 0x.5 test.jpg -draw "image over 0,0 150,150 'video.png'" thumb.jpg
The 0x0 150,150 part means start the video image at 0,0 on the thumbnail and make it 150x150 pixels wide.
Flash Video Player
This was the most promising open source flash HD player I found: http://www.weberdesignlabs.com/blog/?p=24. Unfortunately it doesn't allow configuration of which video to play unless you have Adobe CS3. Luckliy someone in the comments left this version: http://drop.io/fg9dhch. You can configure it in the HTML and it seems to work well. There is a copy here.