MC's journal

Boomtime, the 19 day of Discord in the YOLD 3177

MC:s fotoalbumgenerator

(Missade en bokstav i titeln. Mindre redigeringar i texten. Ber om ursäkt för ompostningen.)

Jag har skrivit en fotalbumgenerator. Jag har inte packat ihop den på något snyggt sätt än men ni kan se lite av dess resultat under mina publika album. Jag meddelar här när koden dyker upp på lagom plats.

Tidigare använde jag Lukas Ertls swiggle som jag hade gjort en del triviala ändringar i men retade mig ibland på den och började för ett tag sedan leta efter alternativ. Jag tyckte lazygal var rätt lovande men det hade dels en hel del beroenden och betedde sig inte som jag hade förväntat.

Då slog det mig: Borde jag inte kunna göra något enkelt med ett litet skalscript? Alldeles säkert har många redan gjort liknande saker. Det verkar finnas massor i alla upptänkliga språk och skal på nätet. Kanske en slags rite of passage för hackers som jag av någon anledning missat? Dags att hacka!

Jag skrev ett litet script som använde convert från ImageMagick för att göra en bunt tumnaglar över alla bilder i en katalog (jag sorterade med ls -tr *.jpg) och slänga in dem i en enda HTML-fil med länkar till de stora bilderna. Scriptet var busenkelt, blev pyttelitet och tog förutsägbart nog jättelång tid att köra över ~300 bilder.

Den uppenbara optimeringen var att låta bli att generera tumnaglar om en tumnagel för bilden redan existerade. Vips så flög programmet fram då det bara behövde jobba när jag lade till nya bilder.

Nästa steg var att skapa en HTML-fil per bild, för jag vill ha två steg till det stora fotografiet: Först ett stort index med alla tumnaglar, sedan en skalad förhandsvisning och sist den stora bilden, precis som den kom från digitalkameran.

Det var också lätt gjort.

Efter det körde jag fast lite, för jag ville också ha länkar till föregående och nästa bild i förhandsvisningen. Hur skulle jag göra det? Med ett språk lite mer kraftfullt än Bourne shell hade jag gjort en lista eller en array med filnamnen i och saken skulle vara biff.

Efter en stunds funderande gav jag upp och fuskade: Jag använde zsh:s arrayer.

images=(`ls -tr *.jpg`)

Vips funkade även det:

# If this isn't the first image, link to the previous
# image with a thumbnail.
if [ $i != 1 ]
then
  echo "<a href='$images[$i - 1].html' accesskey='p'><img src='thumbs/$images[$i - 1]' width='150' height='150'></a>"
else
  echo "No previous."
fi

# If this isn't the last image, link to the next image
# with a thumbnail.
if [ $i != $max ]
then
  echo "<a href='$images[$i + 1].html' accesskey='n'><img src='thumbs/$images[$i + 1]' width='150' height='150'></a>"
else
  echo "No next."
fi

Ja, zsh:s arrayer börjar faktiskt med 1. Och, ja, du kan vandra runt i mina album med N och P. Det är Alt-Shift-N…, i alla fall i Firefox på unixar och Windows. IE8 verkar kräva ett slag på returtangenten också.

Färdigt. Nu var jag på samma nivå som swiggle, ungefär. Ja, OK, swiggle kan lite tuffare sortering också.

Jag ville också ha EXIF-data, åtminstone en tidsstämpel när bilden togs. Först använde jag exiftags men så hittade jag jhead som kunde inte bara det utan en del andra trevliga saker.

Med jheads hjälp (och jpegtran) passade jag också på att peta in automagisk rotation av bilderna också, om nu EXIF-data sa att det behövdes. Hustruns nya kamera känner av hur hon håller den, nämligen.

För att stoppa in kommentarer under varje bild såg jag att JPEG-formatet har något som kallas COM-block. I COM-blocket kan jhead stoppa in godtyckliga strängar. Det använder jag nu för eventuella bildkommentarer.

Efter det skrev jag lite CSS för albumen. Det ser inte så pjåkigt ut och fungerar förstås också bra helt utan CSS.

Det här duger ganska bra för mina små krav. Självklart görs allt det stora jobbet av convert, jhead och jpegtran. Det jag gjort är inte särskilt avancerat i sig utan en naturlig sammanfogning av vad som redan fanns fritt tillgängligt. Leve den fria programvaran!


Written by MC using Emacs and friends.