Bedrijf magie met plaatjes, vanaf de prompt

ArticleCategory: [Es gibt verschiedene Artikel Kategorien]

Graphics

AuthorImage:[Ein Bild von Dir]

[Photo of the Author]

TranslationInfo:[Autor und Übersetzer]

original in en Katja Socher 

en to ne: Rob Huls

AboutTheAuthor:[Eine kleine Biographie über den Autor]

Katja is de Duitse redacteur van LinuxFocus. Ze houdt van Tux, film, fotografie en de zee. Haar homepage kun je hier vinden.

Abstract:[Hier sollte eine kleine Zusammenfassung stehen]

In dit artikel kijken we naar een aantal toverspreuken die de tovenaar met ImageMagick kan uitspreken. Hij gebruikt daarbij een verzameling grafische hulpprogramma's als ingrediënten en de prompt als toverstokje.

ArticleIllustration:[Das Titelbild des Artikels]

[Illustration]

ArticleBody:

Magie bedrijven

Ooit, lang geleden, namen tovenaars hun basisingredienten, mengden ze in een grote pot, zwaaiden met hun toverstokje, murmelden hun spreuken... en opeens was iemand veranderd in een kikker. Tegenwoordig zijn tovenaars, net als ieder ander in onze maatschappij, sterk gespecialiseerd en hun spreukenboek bevat maar een paar bruikbare spreuken voor hele specifieke zaken. ImageMagick is dan ook geen spreukenboek voor algemeen gebruik. In vele opzichten heeft het minder toverkracht dan 'The Gimp' en andere grafische programma's, maar het heeft wat specifieke spreuken die erg nuttig zijn.
Zijn grote kracht ligt in de mogelijkheid vele van zijn spreuken te automatiseren als het vanaf de prompt wordt gebruikt.

Maar voordat we een aantal spreuken op je los gaan laten, zullen we eerst kort de basisingredienten bekijken.

De basisingredienten

of Wat is ImageMagick

ImageMagick is een collectie grafische hulpprogramma's om met plaatjes te werken. Die hulpprogramma's zijn display, import, animate, montage, convert, mogrify, identify en combine.
Display: Als je "display &" intikt verschijnt er een weergavevenster en kun je direct met het plaatje werken. Via het menu kun je een bestand openen, opslaan of wissen, omdraaien, roteren, de kleur veranderen of bepaalde effecten toepassen zoals imploderen, emboss, een frame eromheen zetten en ga zo maar door.
Met Import kun je een foto van het hele scherm maken of van een bepaald venster.
Animate is een hulpprogramma voor animaties. Je kunt een serie plaatjes selecteren die weergegeven moeten worden of je kunt er geanimeerde gifjes mee bekijken.
Met Montage kun je onder andere een collage maken of een plaatje waarin je alle plaatjes ziet die in een animated gif zitten.
Convert is een heel krachtig hulpprogramma. Je kunt een plaatje in een ander formaat omzetten, bijvoorbeeld gif in jpg en omgekeerd. Ook kun je de grootte aanpassen en vele andere effecten zoals houtskool toepassen.
Mogrify lijkt heel veel op convert, met dit verschil dat mogrify het oorspronkelijke plaatje overschrijft. Met alle andere hulpprogramma's moet je de naam opgeven waaronder het plaatje opgeslagen moet worden. Ik gebruik het dan ook vrijwel nooit.
Identify geeft je informatie over het plaatje, zoals de afmetingen, grootte, naam, formaat enzovoorts.
Combine voegt twee of meer plaatjes samen. Je kunt bijvoorbeeld een logo aan elk plaatje toevoegen.

Om een hulpprogramma te gebruiken typ je de naam in gevolgd door de optie die je wilt gaan gebruiken, het plaatje dat bewerkt moet worden en de naam van het bestand waar je het wilt opslaan.
Als je bijvoorbeeld tux1.gif wil 'houtskolen' met een factor 3 en het resultaat wilt opslaan als tux1charcoal.gif tik je in:
convert -characoal 3 tux1.gif tux1characoal.gif

Laten we na deze blik op de basisingredienten een paar spreuken bekijken.

Enige spreuken

Aanpassen van de hoogte en breedte van je plaatjes

Stel je voor dat je een stapel plaatjes hebt van de laatste slachtoffers die je in een kikker hebt veranderd en je wilt deze op je website plaatsen. Om de laadtijd te verkorten wil je de plaatjes kleiner maken.
Met het convert programma kun je plaatjes groter of kleiner maken of thumbnails maken.
Het commando
  convert -geometry 60x80 image.gif out.gif
schaalt het plaatje image.gif naar een breedte van 60 en een hoogte van 80 en schrijft het resultaat naar out.gif.

Om al je plaatjes een hoogte en breedte van 80 te geven kun je dit doen:

#!/bin/sh
for f in $* ;do
 convert -geometry 80x80 $f t_$f
 echo "<a href=\"$f\"><img src=\"t_$f\" width=\"80\" height=\"80\"></a>"
done
# end of script

Typ deze regels in in de texteditor van je keuze (vi, emacs, nedit, kedit, ...) en sla dit op als mksmallimage in je home directory. Ga dan naar de bash shell en tik
  chmod 755 /home/katja/mksmallimage
(gebruik je eigen home directory i.p.v. katja). Je kunt het script dan gebruiken door in te tikken
  /home/katja/mksmallimage xxx.jpg *.gif
Het converteert dan alle gif bestanden en het bestand xxx.jpg.

Overzichtsplaatjes maken

Je hebt een CD met een collectie plaatjes van alle mensen die je de laatste jaren in een kikker hebt veranderd. Nu wil een zeer jaloerse rivaliserende tovenaar bewijs dat je zelfs zijn hond ooit in een kikker hebt veranderd. En vervolgens ben je de hele dag op zoek naar die ene foto. Dit had je kunnen voorkomen als je een overzichtsfoto zou hebben van alle foto's op de CD. Met ImageMagick is dit een koud kuntsje:
  display "vid:*.jpg"
Dit maakt een visueel overzicht van alle jpg-plaatjes in de huidige directory. Of:
  display "vid:kikker/*"
maakt een visueel overzicht van alle plaatjes in je 'kikker' directory.
Door met de rechter muisknop op een plaatje te klikken krijg je een menu waarin je "Load" kan kiezen om het plaatje op volledige grootte te bekijken.

[visueel overzicht]


Dit is een erg gemakkelijk manier om een overzichtsplaatje te maken, maar afhankelijk van je computer en de hoeveelheid plaatjes neemt het genereren ervan nogal wat tijd in beslag en soepeert het een heleboel geheugen op. We zullen daarom een klein html-postzegels- script maken dat in dat opzicht wat minder veeleisend is. We krijgen dan een webpagina waar je op de postzegel (thumbnail) kunt klikken, waarna je het originele plaatje krijgt.

De html code zou er als volgt uitzien:

<a href="file.gif"><img src="t_file.gif" width="60" height="80"></a>

Het originele bestand is hier file.gif en de postzegel versie t_file.gif.
We zullen nu een script schrijven om de postzegels en de html-code voor ons aan te maken.

for f in $* ;do
 convert -geometry 80x80 $f t_$f
 echo "<a href=\"$f\"><img src=\"t_$f\" width=\"80\" height=\"80\">"
done

Het bovenstaande script gaat alle plaatjes die op de prompt zijn opgegeven langs, genereert de postzegels en geeft de HTML code weer op het scherm. Die kun je dan kopieren in onze webpagina.
Voor een compleet script voegen we wat helpteksten en foutcontrole toe. Hier is ons volledige script, genaamd htmlthumbnails:
htmlthumbnails (html om te bekijken), htmlthumbnails (tekst om te downloaden)

Het bestandtype van een plaatje wijzigen

Convert kan niet alleen het formaat van een plaatje wijzigen, maar ook het bestandstype. Je kunt bijvoorbeeld een gif in een jpg omzetten en ook het omgekeerde is mogelijk. Het commando om dit te doen is eenvoudigweg:
  convert image.gif image.jpg
Convert weet, door de extensie van de bestandsnaam, welk formaat het moet gebruiken.
Om een heleboel plaatjes om te ztten van jpg naar gif formaat kun je dit gebruiken:

for f in $* ;do
 if echo "$f" | grep -i "jpg$" > /dev/null ; then
   gif=`echo "$f" | sed 's/jpg$/gif/i'`
   echo "converting  $f to $gif ..."
   convert 80x80 $f $gif
 else
   echo echo "$f is not a jpg file, ignored"
 fi
done

Er zijn nog een heleboel andere formaten die Image Magick ook kent.

Een logo aan al je plaatjes toevoegen

We willen graag een klein logo toevoegen zoals je die wel ziet rechtsonder een aantal plaatjes. [linuxfocus stamp]

Dit logo zou een klein transparant gifje moeten zijn. Ons logo zou als een kleine handtekening in de hoek linksonder van het uiteindelijke plaatje geplaatst moeten worden, zoals je kunt zien in het onderstaande plaatje van ons aller Tux:

[tux with logo]

Wat is het commando om dit te doen?
Het combine hulpprogramma kan gebruikt worden om 2 plaatjes samen te voegen tot een nieuwe. Meerdere opties vertellen het programma hoe dit te doen:
  combine -gravity SouthEast -compose Over img.jpg logo.gif stamp_img.jpg
De optie "gravity SouthEast" plaatst logo.gif in de hoek linksonder. "compose Over" zegt dat we het plaatje willen vervangen waar de twee elkaar overlappen.

Om een volledig functioneel script te krijgen plaatsen we het commando in een for loop en voegen weer wat help tekst en foutcontrole toe. Hier is ons uiteindelijke script, genaamd stampimages :
stampimages (html om weer te geven), stampimages (tekst om te downloaden)

Informatie over de eigenschappen van een plaatje verkrijgen

Identify geeft details weer over het type plaatje, de grootte en geometrie. Het ziet er bijvoorbeeld als volgt uit:

identify  image.jpg
results in
image.jpg 340x254 DirectClass 13939b JPEG 0.1u 0:01

Wat kan onze tovernaar hier nu mee doen? Nou, om goede webpagina's te ontwerpen die plaatjes weergeven terwijl de pagina nog geladen wordt, moet je de exacte afmetingen van alle plaatjes opgeven. De HTML code zou er als volgt uit zien:

<img src="image.jpg" width="340" height="254" alt="[sample picture]">

Als onze plaatjes verschillende, onbekende afmetingen hebben, dan kunnen we identify gebruiken om ons te helpen. We schrijven een script dat de output van identify leest en deze regel weergeeft. De afmetingen staan vermeld op de tweede regel van de uitvoer. Om deze parameter te verkrijgen gebruiken we het commando awk:

identify  image.jpg | awk '{print $2}'
results in
340x254

We moeten nu de maten splitsen in hoogte en breedte. Dit kan als volgt gedaan worden:
  echo 340x254 | sed 's/[^0-9]/ /g' | awk '{print $1}'
wat de breedte zou geven. De hoogte kan verkregen worden met:
  echo 340x254 | sed 's/[^0-9]/ /g' | awk '{print $2}'
Besteed niet te veeel aandacht aan de precieze shell commando's. Als je ze niet helemaal begrijpt, neem dan maar gewoon aan dat ze werken. In de volgende uitgave van LinuxFocus zit een artikel over het programmeren van de shell, waar we veel van de magie ervan zullen uitleggen. Het uiteindelijke script ziet er als volgt uit:

file=$1
geometry=`identify $file | awk '{print $2}'`
# geometry can be 563x144+0+0 or 75x98
# we need to get rid of the plus (+) and the x characters:
width=`echo $geometry | sed 's/[^0-9]/ /g' | awk '{print $1}'`
height=`echo $geometry | sed 's/[^0-9]/ /g' | awk '{print $2}'`
echo "<img src=\"$file\" width=\"$width\" height=\"$height\">"

Om een volledig script te verkrijgen voegen we opnieuw wat helptekst en foutcorrectie toe. Hier is ons uiteindelijke script, genaamd imgsrcline:
imgsrcline (html om weer te geven), imgsrcline (tekst om te downloaden)

Terwijl ik met ImageMagick aan het spelen was liep ik soms tegen discrepanties aan tussen de documentatie en de daadwerkelijke werking. Sommige opties zijn ook nog niet erg stabiel. Als je je echter bij de dingen houdt die we hierboven hebben gedemonstreerd, zul je zien dat het een nuttige set hulpprogramma's is. De bovenstaande functies werken. Ik heb ImageMagick-4.2.9 , ImageMagick-5.2.9 en ImageMagick-5.3.0 gebruikt en de dingen die je hier geleerd hebt werken met al deze versies.

Ik hoop dat je een idee hebt gekregen van wat je met ImageMagick kunt doen en dat je de scripts zult gebruiken of zelfs je eigen spreuken zult maken.
Veel plezier!

Referenties