"Bildbearbeitung auf der Konsole"
 von Sven Guckes   pforzheim2006(at)guckes.net
Latest change: Tue Jul 18 19:29:46 CEST 2006
----------------------------------------------

diese datei:      http://www.guckes.net/pforzheim2006/bildbearbeitung.txt
mein programm:    http://www.guckes.net/pforzheim2006/programm_kurz.ascii.txt
bilder vom event: http://www.guckes.net/pics.2006.07-15/

vortragsseite:    http://infotage.pf-lug.de/2006/page,Vortrag_texttools
programm:         http://infotage.pf-lug.de/2006/page,Programm 

=== Abstract

Für die Bearbeitung von einzelnen Bildern nimmt man die Maus - klar!
Aber für die Bearbeitung von vielen Bildern kann man auch Tools nehmen,
die über die Shell (Kommandozeile, Konsole, Terminals) bedienbar sind.
Das ist oftmals gar nicht so schwer - und die Maus lebt länger.

/* Die Bearbeitung von Bildern ist aufwändig - besonders
   wenn man eine ganze Menge von Bildern behandeln möchte.
   Einzelnes Klicken führt dann schnell zum Maustod. */

Vor allem kann man die Bearbeitung von vielen Bildern
mit TextTools automatisieren.  Und das ist angenehm.

Ich zeige kurz iimage (weil es so schoen einfach ist :-)
und noch ein paar andere hilfreiche Tools:
file, iimage, jhead, jpegtran, ImageMagick
(mit convert, identify und mogrify), mmv.

=== Bilder anzeigen

Bilder möchte man natürlich anschauen.
Dazu braucht man einen "Bildbetrachter".

Es gibt eine Fülle von solchen Programmen.
An dieser Stelle sei aber nur "fbview" erwähnt,
welcher die Bilder im Framebuffer anzeigen kann.

Achtung: "fbview" verlässt sich auf die Dateiendung
und scaliert alles per default auf 640x480.  :-/

So kann es sein, dass ein "fbview foo.gif" nicht angezeigt
werden kann, weil es eigentlich ein JPEG Bild ist.
Daher sollte man die Dateien zuerst auf ihren "Typ" prüfen.
Das macht man mit dem Tool "file".

Wenn man sich aufgrund eds names

Will man das Bild in seiner Originalgröße sehen,
so muss man erst einmal 

Darum sollte man erst bei der 

=== Dateinamen anpassen

Die Dateinamen, die von meiner Kamera für die Bilder
vergeben werden haben das Format img_NNNN.jpg, wobei
NNNN eine fortlaufende nummer von 0000 bis 9999 ist.

Nach einem Jahr bin ich aber diese Nummern schon einmal durch,
so dass ich nun zur Unterscheidung eine "1" davor haben möchte.

Diese Umbenennung mache ich mit "mmv" (aka multi-move):

  alias MMV='mmv '\''img_????.jpg'\'' '\''img_1#1#2#3#4.jpg'\'

Beispiel:
  img_1234.jpg -> img_11234.jpg

Mit "ticks" verhindert man die Expansion des Dateimusters durch die
Shell.  Jedes Fragezeichen steht für ein Zeichen (in diesen Fall eine
Ziffer), das im Ersetzungsmuster der Reihe nach durch #1 bis #4
referenziert wird; dadurch gehen die Ziffern auch nicht verloren.
Lediglich eine zusätzliche "1" kommt hinzu.  Fertig!

=== file

"file" testet jedes Argument und macht drei Durchgänge, um es
 zu klassifizieren:  Dateisystem, Magic Number, und Sprache.

Mit file kann man also den Dateityp rausfinden.

$ file * | less
$ file * > file.txt

$ file foo.gif
foo:gif: JPEG image data, JFIF standard 1.01

soso.. ;)

leider zeigt uns "file" nicht wie gross das Bild ist.
das macht aber "identify" (dazu spaeter mehr).

=== Iimage

Iimage produziert aus einem Verzeichnis mit Filmen (avi, mov) und
Bildern (gif, jpeg, png) eine Übersicht in zwei Stufen von thumbnails.
Per JavaScript kann man die Zwischenstufe auch als Slideshow ansehen.
Über eine Datei "descriptions" kann man die Bilder
und Filme in der Übersicht auch beschriften.

Iimage ist ein einziges Shell Script, ca 60KB gross.
Es ist direkt lauffähig, dh man braucht es
weder zu entpacken noch zu installieren.

Es enthält zu ca 15KB codierte images -
ein icon fuer Verzeichnisse und ein icon
für Dateiformate (avi, mov, snd).

Es benutzt die folgenden Programme: (standard) awk
basename cat cp cut date echo find grep mkdir mv rm uname
(special) convert identify jpegtran metacam mplayer

iimage runterladen:
$ wget http://www.ronsc.de/iimage/devel/iimage

ausführbar machen:
$ chmod 755 iimage

ins eigene "bin" verzeichnis packen
(welches natürlich auch im $PATH sein sollte):
$ mv iimage ~/bin

Eventuell vor der Benutzung die Dateimaske ändern
(zB falls die Bilder auf dem Webserver sind):
$ umask 022

Thumbnails und Index generieren:
$ iimage

falls image nicht im $PATH ist oder
die permissions nicht stimmen, so
kann man es auch direkt ausfuehren:
$ sh iimage

ja, - das war's schon.  :)

Generierung der Indexdatei:
das sieht dann ungefaher so aus:

  ~/bilder> iimage
  _____________________________________________________________________________
  IIMAGE r36 (c) Ronald Schmidt http://www.ronsc.de
  .
  features: jpegtran jhead identify>5.x
  legend:   I..identify S..size M..metacam J..jhead T..thumb O..optimize
  -----------------------------------------------------------------------------
  /home/guckes/bilder

iimage identifiziert sich also erst einmal und
zeigt dann an welche tools es finden konnte.
Die Legende gibt dann die Beziehungen
zwischen Buchstaben und Operationen an
(siehe Funktion "build_thumbnail").

Zeitspanne der Bearbeitung messen:
$ time iimage

Achtung:
Die Dateinamen sollte keine Leerzeichen enthalten.
"export LANG=en_EN"!

neue version?  iimage ersetzt sich selbst:
$ iimage -D

Datei "description" anlegen:
$ iimage -d

Iimage      http://www.ronsc.de/iimage/iimage
update:     iimage -D
maillist:   iimage(at)ronsc.de
newsgroup:  gmane.comp.web.iimage
Maintainer: Ronald Schmidt -> http://guckes.net/pics.2006.03-04/.tmp/img_4644.jpg.html

=== jhead

jhead is a command line driven utility for extracting digital camera
settings from the Exif format files used by many digital cameras.
It handles the various confusing ways these can be expressed, and
displays them as F-stop, shutter speed, etc. It is also able to reduce
the size of digital camera JPEGs without loss of information, by deleting
integral thumbnails that digital cameras put into the Exif header.

$ jhead img_4717.jpg
File name    : img_4717.jpg
File size    : 13735 bytes
File date    : 2006:03:07 20:03:28
Camera make  : Canon
Camera model : Canon DIGITAL IXUS 300
Date/Time    : 2006:03:05 12:41:12
Resolution   : 200 x 150
Flash used   : No
Focal length :  5.4mm  (35mm equivalent: 37mm)
CCD width    : 5.23mm
Exposure time: 0.100 s  (1/10)
Aperture     : f/2.7
Focus dist.  : 2.69m
Metering Mode: matrix
Jpeg process : Progressive

zeitpunkt der aufnahme != zeitpunkt der datei
darum:  uhr bei kamera richtig einstellen!

mithilfe von jhead kann man die photos umbenennen,
zB umbennung der JPEGs in datum+zeit als namen -
format "YYYYMMDD-HHMMSS":
$ jhead -n%Y%m%d-%H%M%S *.jpg

Aktuellen Dateinamen benutzen:
$ jhead -n%Y%m%d-%H%M%S.%f pattern
img_4717.jpg -> 20060307-200328.img_4717.jpg

Numerieren über %i (sequence number)
$ jhead -n%04i.%f pattern

Setzen der Dateizeit auf
dien Zeit im exif header:
$ jhead -ft pattern

=== jpegtran + zsh

Drehen mithilfe von Funktionen (zsh):

$ _JRR bild1.jpg bild2.jpg bild3.jpg

  function _JRR {
  for pic in $*; do
    TEMPFILE=$1_rot090_$$_tmp.jpg
    [ -f "$pic" ]
    echo "$pic";   /usr/bin/jpegtran -rotate 90 -copy all "$pic" \
    >$TEMPFILE && touch -r "$pic" $TEMPFILE; mv $TEMPFILE "$pic"
  done
}

Löschen der korrespondierenden thumbnails:
$ kick bild1.jpg bild2.jpg bild3.jpg

Thumbnails der gedrehten Bilder
und den Index neu generieren:
$ iimage

=== ImageMagick

== identify - describes the format and characteristics of one or more image files.

$ identify *jpg *png
linuxmag_france_nov99_vim55.jpg JPEG 826x1137 DirectClass 206kb
written-with-nvi.png[1] PNG 88x31 88x31+0+0 DirectClass 440

== convert + mogrify:

Reine Konvertierung:
convert filename.jpg filename.gif

Konvertierung mit angabe von breite und hoehe (geometry):
convert -geometry 640x480 filename.jpg filename.png

Mit Ausgabe während des Vorgangs:
convert -verbose filename.jpg filename.png

Kommentar ändern:
convert -comment "the comment" picture

mogrify - wie convert - überschreibt aber das Original.

$ mogrify foo.jpg foo.gif

=== netpbm

Netpbm is a toolkit for manipulation of graphic images, including conversion
of images between a variety of different formats. There are over 220 separate
tools in the package including converters for more than 80 graphics formats.

220 tools.. 80 Graphikformate... au weia! ;-)

=== exiftran (TODO)

exiftran is a command line utility to transform digital image jpeg images.
It can do lossless rotations like jpegtran, but unlike jpegtran
it cares about the EXIF data: It can rotate images automatically
by checking the exif orientation tag, it updates the exif informaton
if needed (image dimension, orientation), it also rotates
the exif thumbnail.  It can process multiple images at once.