September 06, 2007 by alex
Open Source ist wirklich eine tolle Sache, jeder kann den Code für seine Zwecke anpassen. Das haben wir auch schon ein paar mal gemacht, hier kommt noch einen schönes Beispiel welches für Open Source spricht.
Wir haben viele kleine thumbnails auf der Startseite von autoki, die haben wir genauso wie alle anderen Formate mit file_column generiert. file_column ist ein praktisches Plugin das eine Schnittstelle über RMagick zu ImageMagick bildet, um einfach verschiedene Formate von Bildern für ein Model zu generieren. Vor Kurzen mussten wir feststellen, dass die autoki Startseite ungewöhnlich viel Bandbreite braucht. Beim Blick auf ein einzelnes Thumbnail zeigte sich, das bereits ein kleines 53x53 Pixel Jpeg 48KB gross ist.
Die erste Vermutung war, dass die Qualituatseinstellungen für die Jpeg Kompression zu hoch ist. Ein bisschen Suchen in der RMagick Dokumentation brauchte das attribut quality hervor, mit dem sich die Qualitätseinstellungen regeln lässt. Etwas ausprobieren brachte dan auch einen Teilerfolg. Indem den schlüssel :attributes ein Hash übergeben für die einzelnen Versionen übergeben wird liess sich die qualität steuern. Aber das brachte nur ein paar Kilobyte.
Also musste das Problem wo anders liegen. Nächste Ansatzpunkt war die Kompression. Auch hier half die RMagick Doku weiter. Mit dem key :compression läst sich die Kompression festlegen. Aber auch hier kein Erfolg, wie erwartet wird automatisch die Kopression verwendet die die Dateiendung vorgibt.
Also die Datei mit TextMate geöffnet um vielleicht einen Hinweis auf das Problem zu erhalten. Dort fand sich neben dem erwarten Zeichensalat XML tags. Diese sahen nach EXIF-Informationen aus. Im EXIF-Format werden Meta-Daten über die Aufnahme wie Zeitpunkt, Kamera, Belichtungsinformation etc. gespeichert. Dazu fanden sich noch weitere XML Blöcke die offensichtlich von Photoshop stammen. Das Problem war also das die Metadaten aus der Datei nicht entfernt wurden.
Jetzt wo das Problem bekannt war, konnte auch die Suchmaschiene dazu befragt werden, wie man diese Metadaten loswird. Die Antwort ist strip. Die Rmagick methode entfernt alle Nichtbilddaten. Wird bei file_column eine Bildvariante mit :thumbnail satt :version erstellt wird strip ebenfalls aufgerufen. Doch die Thumbnail Varianten lassen sich nicht mit crop noch zusätzlich beschneiden. Aber genau das machen wir um gleichmässig erschneinende thumbnails zu erstellen. Darum muss die strip Methode an geeigneter Stelle aufgerufen werden. Da die skalierung und das beschneiden in der mehtode transform_image in der FileColumn Klasse geschiet ist dort ein guter Ort strip aufzurufen. Ob nun am Anfang oder am Ende ist eigentlich egal. Da wir all unsere anderen file_column Hacks auch ans ende dieser MEthode gepack haben, kommt der strip aufruf noch dazu.Und nachdem die Bilder mittels regenerate_images neu erstellt waren, ist die Grösse der tumbnails auf etwa 4KB (ein Zehntel!) gesunken. Jetzt baut sich die Startseite viel schneller auf und der Bandbreitenbedarf ist erheblich gesunken.
Also um kleine Thumbnails zu generieren kann man entweder :thumbnail statt :version in file_column verwenden, wenn man die thumbnails jedoch zuschneiden will sollte man am besten strip in der methode transform_images aufrufen um die Metadaten wie z.B. EXIF Informationen aus der Datei zu entfernen. Das ganze kann sich auch lohnen wenn viele grosse Bilder gespeichert werden müssen.