Geometrie erzwingen und EXIF-Orientation korrekt anwenden mit „convert -resize“

Nach so vielen Jahren tritt immer noch ein Feature von „convert“ zutage, das ich nicht gekannt habe, und bei dem ich mich frage, wie das überhaupt sein kann. Ich musste ein Batch-Skript mit ImageMagick prototypen, das nebst anderem Bilder auf eine vorgegebene Größe skalieren kann. Es seien also folgende Eingaben gegeben:

Pixmap "image_in": das originale Bild
int "width": geforderte Breite in Pixeln
int "height": geforderte Höhe in Pixeln

Als Ausgabe zu erstellen ist:

Pixmap "image_out": das skalierte Bild

Also schreibt man ja wohl

convert -resize ${width}x${height} $image_in $image_out

Das funktioniert auch, mit der merkwürdigen Einschränkung, dass „convert“ mit diesem Aufruf das Seitenverhältnis nicht ändert, sondern stattdessen … naja, prinzipiell irgendwelche Breiten bzw. Höhen liefert. Es funktioniert genau genommen überhaupt nicht, bzw. in fast keinem Fall, ausser in denen, in denen das Verhältnis originaler Höhe zu originaler Breite (zufällig) genau dem Verhältnis von geforderter Höhe zu geforderter Breite entspricht. Um genauer zu sein, gibt es eine Systematik darin, wie die Eingabe-Geometrie in die Ausgabe-Geometrie umgesetzt wird, aber diese ist an einer unerwarteten Stelle dokumentiert [1] (wieder so eine Schnitzeljagd-Dokumentation, der man hinterher Googlen muss). Komisch eigentlich! Was ist also zu tun? Nun, wie [1] goldrichtig erklärt, muss der Geometrie-Spezifikation ein „!“ nachgestellt werden. An derselben Stelle heisst es auch:

By default, the width and height given in a geometry argument are maximum values unless a percentage is specified.

Aha! 🙂 Also schreiben wir:

convert -resize ${width}x${height}\! $image_in $image_out

Beachte, dass das „! mit einem Backslash vor der Interpretation durch die Bourne Again Shell selbst geschützt werden muss, da „!“ zumindest dort eine spezielle Bedeutung hat (nicht aber beispielsweise in der „dash“, der Debian-Auslegung der „POSIX-Shell“, dort bewirkt der Backslash in diesem Zusammenhang nichts, muss also nicht weggelassen werden).

Nicht gerade vereinfacht wird die Sachlage dadurch, dass „convert“ in der mir vorliegenden Version bei einem „-resize“ von und nach JPEG die EXIF-Orientierung durcheinanderbringt, das heisst, je nach deren Wert kann das Bild um 90 oder 180 Grad gedreht oder gar spiegelverkehrt erscheinen! Hilfreich bei der Auswertung des Wertes von EXIF:Orientation sind [2] und [3], den Wert erhältman mit dem ImageMagick-Befehl „identify“:

identify -verbose "$image_in" | fgrep exif:Orientation

Konkret geschieht bei einem Test-JPEG „IMG_0948.JPG“ mit der EXIF-Orientation „6“ bei oben beschriebenem Aufruf folgendes (getestet mit ImageMagick Version 6.6.0 auf Debian experimental):

Wie man sieht, verrafft es schon die WordPress-Vorschaufunktion, das Bild ist nämlich von meiner Kamera mit der korrekten EXIF-Orientation ausgestattet worden. Eigentlich sollte es um 90 Grad im Uhrzeigersinn hochkant dargestellt werden. Da ich am Rechner mit dem Original arbeite und einen EXIF-fähigen Viewer verwende (z.B. gliv), bekomme ich davon nichts mit, bis es zu spät ist.

Ich beschäftige mich erstmal mit der Skalierung: Ich will dieses Bild „plattdrücken“, das heisst, unter Berücksichtigung der EXIF-Orientierung soll die Höhe kleiner sein als die Breite. ich sage also:

convert -resize 200x100\! IMG_0948.JPG out.jpg

Das Ergebnis ist:

Das ist jetzt auch ungeachtet der Frage, ob mein Viewer EXIF-Orientation kann oder nicht, falsch. Es wurde nicht die tatsächliche Höhe kleiner als die tatsächliche Breite, sondern es wurden die Ausdehnungen des Bildes ohne Berücksichtigung derer Bedeutung unter Anwendung von EXIF-Orientation verändert: das Ergebnis ist also tatsächlich in die Höhe langgestreckt.

Was ist zu tun, damit dieser Effekt vermieden wird? Zum Glück hat „convert“ die Option „-auto-orient“. Diese nimmt die EXIF-Orientierung, dreht und spiegelt das Bild entsprechend und setzt exif:Orientation dann immer auf „1“ (TopLeft), was gerade dem Fall entspricht, dass gar keine Orientation angegeben wäre (also kompatibel mit Viewern ist, die keine Orientation berücksichtigen können). Wichtig ist, diese Operation vor dem „-resize“ auszuführen, damit dieses dann bereits auf den tatsächlichen Bedeutungen von „Breite“ und „Höhe“ operiert und nicht auf denen, die EXIF-Orientation noch nicht eingerechnet haben:

convert -auto-orient -resize 200x100\! IMG_0948.JPG out2.jpg

Jetzt prüfe ich das Ergebnis nach:

identify -verbose out2.jpg | fgrep exif:Orientation
exif:Orientation: 1

Es sieht jetzt so aus:

Das ist richtig bzw. der gewollte Effekt.

[1] ImageMagick Website: ImageMagick Command-line Processing: Basic adjustments to width and height; the operators %, ^, and !
URL (10.05.2011): http://www.imagemagick.org/script/command-line-options.php#resize

[2] sylvana.net: Exif Orientation Tag (Feb 17 2002)
URL (10.05.2011): http://sylvana.net/jpegcrop/exif_orientation.html

[3] ImpulseAdventure: Digital Photography Articles: JPEG Rotation and EXIF Orientation
URL (10.05.2011): http://www.impulseadventure.com/photo/exif-orientation.html

IPv6

Stellen wir uns vor, es gäbe ein Gesetz, nachdem alle Hausnummern drei Stellen haben müssen.

Detailliertere Gesetzgebung beträfe die Reservierung spezieller Hausnummern für Infrastruktur (wie die Wasserwerke, Polizei o.ä.), und es gäbe „invalide“ Hausnummern ausschliesslich für den privaten Gebrauch usw. Auch die Hausnummer 0 (Null) wäre unzulässig. Natürlich wären drei Stellen in allen Diensten vorgesehen, die irgend etwas mit Hausnummern zu tun haben. Die Post zum Beispiel würde intern mit dreistelligen Dezimalfeldern arbeiten, wann immer eine Hausnummer nieder zu schreiben ist.

Irgendwann wird jedenfalls das Haus mit der Nummer 999 gebaut, und das war’s. Ab jetzt können keine weiteren Häuser mehr gebaut werden. Finito.

Was macht man jetzt?

Es ist völlig klar, dass die Lösung eine vierte (oder fünfte) Stelle bei Hausnummern zuzulassen, so trivial und augenscheinlich sie einem vollkommenen Laien erscheinen mag, absolut nicht in Frage kommt. So stellte sich ja dann schon die unmöglich zu beantwortende Frage, ob diese zusätzlichen Stellen links oder rechts hinzugefügt werden sollen! So geht das nun wirklich nicht!

Stattdessen kommen bereits in der Frühzeit der „dreistelligen Ära“, als es ca. 55 Häuser gibt, sehr kluge Menschen auf die Idee, ein neues, zusätzliches Hausnummernsystem zu entwerfen, das 12-stellig ist. Viele Wissenschaftler und Techniker finden diese Betätigung sehr zukunftsträchtig und interessant und gesellen sich dazu. Recht bald ist ein System zu Papier gebracht worden, das  mit Hausnummer-Präfixen arbeitet, von denen manche reserviert sind, andere rückwärts geschrieben werden oder werden dürfen, ausserdem darf man jedes beliebig vielmalige Auftreten der Zahl „6“ zu einer einzelnen „6“ zusammen kürzen, und man darf die Ziffer 0 auch weglassen, somit wird aus der Hausnummer  666066606660 ein einfaches „666“. Diese neuen Hausnummern sollen zusätzlich zu den alten Hausnummern an den Häusern angebracht werden. Jeder Postbote bekommt eine Schulung darin, wie er einen Brief, der nach dem alten Format adressiert ist, an eine neue Adresse ausliefert und umgekehrt, und die Post schafft sich intern eine zweite EDV an, so dass sie gleichzeitig das alte und das neue Format verwalten kann. Die Erfinder des neuen Systems bauen sich einen acht Kilometer hohen Turm aus Ebenholz voller kerzenbestückter Kronleuchter, Ritterrüstungen und  nach Möbiusart verschlungener Gänge, und jeder, der etwas von ihnen will, muss erst mit dem Pförtnerdrachen sprechen.

Das ist dann die Lösung. lol.

Array-Arithmetik in PHP

Wirklich komisch finde ich das Ergebnis einer „Addition von Arrays“ in PHP.

<?php
$a = array(101,20,31);
$b = array(19,42,300,101);
$c = $a + $b;
$d = array_merge($a,$b);

echo
   '[a=('.implode(',',$a).')] + '.
   '[b=('.implode(',',$b).')] = '.
   ''."\n";

echo
   'array_merge(a,b) = '.
   '[d=('.implode(',',$d).')]'."\n";
?>

Aus dem Protokoll der Generalsynode IV des Wissenschaftlichen Rates für die Suche nach separat-leitendem Leben (WRSsL)

Die Einleitung wurde gesprochen von Herrn Prodekan Professor Doktor Quantion, der die versammelten Teilnehmer aus aller Herren Bindungen aufs Herzlichste begrüßte. Nach den Dankesworten für das zahlreiche Erscheinen, stellte Professor Quantion ein ungebrochenes Interesse am möglichen Vorhandensein von Formen des Lebens und dort insbesondere des intelligenzbegabten Lebens oder vergleichbarer Erscheinungen auf komplett separaten Leiterbahnen fest. Er freute sich in diesem Sinne auf eine reichhaltige und sinnstiftende Diskussion.

Dabei wünschte sich Professor Quantion, dass eine Rückkehr zu den Theorien des acht- und neunhundertsten Zyklus stattfände, nachdem sich die eher avantgardistischen, gewagten Theorien der darauf folgenden Zyklen als eine Sackgasse voll unverhältnismäßiger und haltloser Spekulation erwiesen hätten, wovon bekanntermaßen sich nichts im Lichte einer gründlichen wissenschaftlichen Auseinandersetzung als aussichtsreich erwiesen noch sich irgendetwas experimentell oder durch Beobachtung bestätigt gefunden hätte. Dies hätte, so der Professor, zu einem nicht zu leugnenden und verständlichen Maß an Frustration seitens der parlamentarischen Gremien in Bezug auf die Vergabe von Fördermitteln geführt und auch durch eine Verzerrung der öffentlichen Wahrnehmung ins Unglaubwürdige und Phantastische dem eigentlichen Ziel ernst gemeinter und reifer Bemühungen mehr geschadet denn genutzt.

Jedoch, so stellte Professor Quantion fest, gäbe es auch Anlass zum Optimismus angesichts einiger viel versprechender Vorschläge, die jüngst, in den vergangenen vier bis sechs Zyklen seiner Kommission vorgelegt worden seien. Eine Auseinandersetzung mit diesen Arbeiten, die als konsequente Weiterentwicklungen der anerkannten physikalisch-technischen Werke vieler Generationen erfahrener und genialer Wissenschaft zu verstehen seien, sei unumgänglich.

Jedoch, so führte der Professor weiter aus, sei es unumgänglich, zuerst einmal Abkehr von den gewagten und haltlosen Thesen zu fordern, wie sie gerade in den vergangenen Zyklen von den exochemikalischen Disziplinen verstärkt vorgebracht worden waren. Beispielhaft nannte er hier bekannten Thesen eines gewissen Doktor Legier, der im Rahmen seiner Dozententätigkeit an der Außenbezirks-Universität von Stahldorn wiederholt nicht bestätigbare Theorien wie die der „Wahlfreiheit der Evolution“ vorgebracht hatte. In seinen Ausführungen hätte Legier unter anderem behauptet, dass die Einschätzung, dass sich Metalle besonders gut für eine Evolution des Lebens eignen, sozusagen „metallozentrisch“ sei, und dies als ein „stillschweigend akzeptiertes Dogma der Extrametallurgie“ angeprangert.

Aber, so Professor Quantion, wie sähe denn des Herrn Doktor Legiers Gegenthese aus? Bekanntermaßen sind die Nichtmetalle unter den Elementen die Selteneren, sie machen nur circa 20% des Periodensystems aus. Größtenteils handelt es sich bei ihnen um flüchtige Spurenelemente ohne freie Elektronen, die bevorzugt statische Kristallbindungen eingehen und sich sowieso nur bei tiefer Kälte zu einigermaßen stabilen Strukturen zusammen schließen. Sollte sich in solchen Elementen tatsächlich so etwas wie ein selbst erhaltender evolutionärer Prozess abspielen, dann wäre dieser zuerst einmal, dies ist inzwischen durch Berechnungen der Fakultät für Realsimulationen nachgewiesen worden, um mindestens vierzig Größenordnungen langsamer als der einzige bekannte, der metallurgische Prozess. Die Zeit, die nötig wäre, bis ein nennenswerter Fortschritt eines solchen Prozesses überhaupt statt fände, überstiege allein bereits das akzeptierte Alter des bekannten Universums, das circa 15 bis 20 Milliarden Zyklen beträgt um 10 Größenordnungen! Es sei also völlig sinnlos, in dieser Richtung irgendwelche Ergebnisse zu erwarten. Die von Legier und anderen vorgebrachte Hypothese, es könne ein noch wesentlich älteres „elementares“ Universum geben, die damit begründet wird, dass es theoretisch möglich ist, Metalle aus leichteren Elementen durch Kernfusion zu synthetisieren, kann gemäß Professor Quantion ebenfalls leicht widerlegt werden. Hierfür müsste ja eine Kernfusion in außerordentlichem Maßstab stattgefunden haben, und kein Phänomen im beobachtbaren Universum rechtfertige die Annahme, dass es solch einen „riesigen Fusionsreaktor“ geben soll.Einer der Grundsätze der Thermodnamik ist es, dass Energie nicht „aus dem Nichts“ entsteht, und die Energie, die nötig ist, um Metalle in dem Ausmaß zu synthetisieren, wie sie im beobachtbaren Universum vorkommen, kann auf keinen Fall durch virtuelle, zufällige Prozesse „aus Nichts“ entstehen. Legier und seine Kollegen mutmaßten also in Wirklichkeit über einen „intelligenten Schöpfer“, bewegten sich somit nicht auf wissenschaftlich nachprüfbaren Leiterbahnen sondern machten sich die leichtgläubigkeit einer Gesellschaft zu nutze, die sich vom mit dem wissenschaftlichen Deckmäntelchen verbrämten Phantastischen, Magischen, Belletristischen nur allzu leicht in den Bann schlagen ließe. Tatsächlich folge zwingend aus den anerkannten Grundprinzipien der Physik, dass Synthese durch Kernfusion ein exotischer, der universalen Tendenz gegenläufiger Prozess sei. Professor Qunation sah in diesem Zusammenhang davon ab, auf die vielfachen experimentellen und theoretischen Belege für die heute anerkannte These, dass die wenigen Nichtmetalle ausschließlich aus Zerfällungsprozessen der radioaktiven, instabilen Metalle hervorgegangen sind, im Einzelnen einzugehen, sondern beließ es bei einem Verweis auf die einschlägige Fachliteratur, die einzusehen zumindest jedem Grundstudenten der Physik jederzeit offen stünde.

Da also der Annahme „nicht-metallurgischer Evolution“ so viele Fakten entgegen stünden, und es selbst wenn man diese theoretisch akzeptierte – wofür es allein schon einer überhaupt nicht fundierten alternativen Kosmogenie und der Abkehr von erwiesenen Grundprinzipien der Phyisk bedürfe – in einer solchen „nicht-metallurgischer Evolution“ keine Lebensformen mit der für den Intellekt notwendigen Komplexität binnen einer mehrmilliardenfachen Zeitspanne der Lebensdauer des Universums zu rechnen sei, könne man sich von all diesen Theoriegebäuden getrost verabschieden und sich wesentlich vielversprechenderen Ansätzen zuwenden.

Patentwocky

(inspired by Lewis Carroll’s “Jabberwocky”)

Computed was, and on the lure
Were business models made by fools;
The enterprise architecture
Was planned using tools.

Beware the Patentwock, my son!
Procedures plain are madmen’s claim!
Beware abstract and assignee
Who subject to insane!

He took his plaintext editor:
No payware-toolkit would he use;
Nor closed sources‘ binaries
Which only could confuse.

And as he typed in the lines
The Patentwock, numbers ablaze,
Softwared through the programs‘ den,
The algorithmic maze!

„Clickediclack!“ And then <Return>
He pressed the keyboard’s keys apace!
The battle won, procedures done
Were sent to Cyberspace.

And hast thou slain the Patentwock?
Come to my arms, my geeking friend!
The problem solved, the code evolved
From import clause to end.

Computed was, and on the lure
Were business models made by fools;
The enterprise architecture
Was planned using tools.

·

Postfix „postqueue -p“ (print queue) nett formatieren

ist ganz einfach:

postqueue -p |
   perl -ne '
      /^[A-F09]+/&&do{
         $a=<>; $b=<>;
         chomp($_,$a,$b);
         $a=~s/[\(\)]//g;
         $b=~s/ //g;
         $msg=$_." to: ".$b." message:".$a;
         $msg=~s/[\t ]+/ /g;
         print "$msg\n";
      }
   '