imagemagick
Foto's in batch verkleinen met imagemagick
Gisteren stelde Monica Monté een beetje een rare vraag op Twitter: "Bestaat er een manier om een hoop foto's (+100) in een batch te verkleinen (7mb >1mb) Via Photoshop, Lightroom, Bridge,...?"
Ik vind het een rare vraag omdat bestandsgrootte een ééndimensionaal gegeven is, terwijl foto's eigenlijk 3 dimensies hebben: lengte, breedte en kleurdiepte. Of 2 dimensies, als je alleen van lengte en breedte spreekt, en het aantal kleuren gelijk blijft in je omzetting. Bovendien, bij JPEG-compressie (daar bleek het achteraf inderdaad om te gaan) is het bij een foto waarvan je alleen de lengte en breedte weet, quasi onmogelijk om te voorspellen wat de bestandsgrootte gaat zijn, zonder het jpeg-compressiealgoritme uit te voeren. 2 verschillende foto's maar met exact dezelfde lengte en breedte zullen meestal een verschillende grootte hebben. Soit, Monica moet bij gelegenheid maar eens uitleggen wat ze bedoelde.
Er waren direct een aantal mensen die deze sympathieke fotoredactrice ter hulp snelden met hun advies voor zware softwarepakketten zoals Lightroom (@Jannemans, @mbargo, @bartclaeys, @Schuppe), iPhoto (@boskabout), Photoshop (@broodkast, @kodel, @eyeballkid), Picasa (@raf__) en Irfanview (@vdbvdb). @robindheer zat ook met dezelfde vraag: hoe verklein je foto's in batch?
Maar mensen, waarom allemaal zo moeilijk doen? Zoals ik gisteren al schreef op Twitter: het in batch verkleinen van afbeeldingen is iets waarvoor imagemagick ideaal geschikt is.
Ubuntu beschrijft het als volgt:
amedee@fangorn:~$ apt-cache show imagemagick Package: imagemagick Priority: optional Section: graphics Installed-Size: 348 Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com> Original-Maintainer: ImageMagick Packaging Team <pkg-gmagick-im-team@lists.alioth.debian.org> Architecture: amd64 Version: 7:6.5.1.0-1.1ubuntu3 Depends: libbz2-1.0, libc6 (>= 2.3.4), libfreetype6 (>= 2.2.1), libgomp1 (>= 4.2.1), libice6 (>= 1:1.0.0), libjpeg62, liblcms1 (>= 1.15-1), libltdl7 (>= 2.2.6a), libmagickcore2, libmagickwand2, libsm6, libtiff4, libx11-6, libxext6, libxt6, zlib1g (>= 1:1.1.4) Suggests: transfig, imagemagick-doc Filename: pool/main/i/imagemagick/imagemagick_6.5.1.0-1.1ubuntu3_amd64.deb Size: 95720 MD5sum: 87d33361ab2486f49c8ea077d8933eff SHA1: b1a0da0347944a35984d40f7f85e94a52d576ae8 SHA256: 431d515a1b033b167f2517382e944ccdc60388bb326dd43adfc1f15a552a8a49 Description: image manipulation programs ImageMagick is a software suite to create, edit, and compose bitmap images. It can read, convert and write images in a variety of formats (over 100) including DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PhotoCD, PNG, Postscript, SVG, and TIFF. Use ImageMagick to translate, flip, mirror, rotate, scale, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and Bézier curves. All manipulations can be achieved through shell commands as well as through an X11 graphical interface (display). Homepage: http://www.imagemagick.org/ Bugs: https://bugs.launchpad.net/ubuntu/+filebug Origin: Ubuntu Task: kubuntu-desktop, kubuntu-netbook, edubuntu-desktop-gnome, edubuntu-desktop-kde, xubuntu-desktop
Het omzetten van een groot aantal afbeeldingen is poepsimpel. Je geeft gewoon een van de volgende commando's in de directory waarin de te verkleinen afbeeldingen staan:
mogrify -resize 40% *.jpg mogrify -resize 800x600 *.jpg mogrify -resize 800 *.jpg mogrify -resize 800x600! *.jpg
- Verklein alle afbeeldingen naar 40% van hun oorspronkelijke afmeting.
- Verklein alle afbeeldingen zodat die binnen 800x600 pixels passen, met behoud van de aspect ratio.
- Verklein alle afbeeldingen zodat de breedte 800 pixels is.
- Verklein alle afbeeldingen zodat de afmeting exact 800x600 pixels is, waarbij de aspect ratio verloren mag gaan.
mogrify past de afbeeldingen in-place aan, dus de originelen worden overschreven. De om te zetten afbeeldingen zet je dus best op voorhand in een aparte directory, ofwel gebruik je convert ipv mogrify zodat je een nieuwe bestandsnaam kan (moet) meegeven.
Snelheidstest
Ik ben ervan overtuigd dat imagemagick véél efficiënter is dan al die GUI-programma's (met uitzondering misschien van lichtgewicht Irfanview). Daarom daag ik alle Windowsers en Appelaars uit voor een snelheidstest.
Ik heb 100 jpg-afbeeldingen gemaakt, allemaal bestaande uit willekeurige ruis. Je kan hier een kleiner voorbeeld (100x100) downloaden, of je kan ze ook zelf aanmaken met mijn bash scriptje img-create:
#!/bin/bash for (( COUNTER=1; COUNTER<=100; COUNTER++ )) do convert -size 3000x3000 xc: +noise Random noise-"$COUNTER".jpg ls -hl noise-"$COUNTER".jpg done exit
amedee@fangorn:/tmp$ time ./img-create -rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 15:57 noise-1.jpg -rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 15:57 noise-2.jpg -rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 15:57 noise-3.jpg ... -rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 16:08 noise-98.jpg -rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 16:08 noise-99.jpg -rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 16:08 noise-100.jpg real 11m3.026s user 10m44.710s sys 0m13.570s
img-resize zet ik ze om naar een kleiner bestand:
#!/bin/bash for filename in `ls noise*.jpg`; do convert $filename -resize 50% small-"$filename" ls -hl *"$filename" done exit
amedee@fangorn:/tmp$ time ./img-resize -rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 16:08 noise-100.jpg -rw-r--r-- 1 amedee amedee 1,5M 2009-11-22 17:28 small-noise-100.jpg -rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 15:58 noise-10.jpg -rw-r--r-- 1 amedee amedee 1,5M 2009-11-22 17:28 small-noise-10.jpg -rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 15:58 noise-11.jpg -rw-r--r-- 1 amedee amedee 1,5M 2009-11-22 17:28 small-noise-11.jpg ... -rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 16:08 noise-98.jpg -rw-r--r-- 1 amedee amedee 1,5M 2009-11-22 17:30 small-noise-98.jpg -rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 16:08 noise-99.jpg -rw-r--r-- 1 amedee amedee 1,5M 2009-11-22 17:31 small-noise-99.jpg -rw-r--r-- 1 amedee amedee 7,6M 2009-11-22 15:58 noise-9.jpg -rw-r--r-- 1 amedee amedee 1,5M 2009-11-22 17:31 small-noise-9.jpg real 2m46.400s user 3m37.430s sys 0m10.530s

